Наличие деструктора (~ Object ()) на языке управляемого программирования - самая глупая идея.
Совершенно логично для неуправляемых языков, таких как C, C ++, иметь деструкторы, поскольку они используют идиому RAII, но для управляемых, таких как Java, C #, просто абсурдно.
Джошуа Блох, бывший руководитель проекта в Java Collection Framework, указал, что идея метода finalize () (который эквивалентен C ++ как деструктор C ++) в Java была самой большой ошибкой, когда-либо совершенной. Как и в C #, finallize () в Java дает служебные данные «new», так как оно должно быть добавлено в очередь финализатора во время выделения. Более того, сборщик мусора должен выскочить и запустить finallize () в очереди, так что вдвое больше затрат во время gc.
В C # было много улучшенных функций, таких как «using (IDisposable) {}», которые не только позволяют ограничивать переменную IDisposable областью действия «using», но и гарантируют его очистку.
Мой вопрос: почему C # следовал по тому же пути Java, что привело к большой ошибке.
Возможно, если бы разработка dotnet началась после 2003-2005 годов, когда многие Java-архитекторы обнаружили ошибку finallize (), тогда ошибка была бы предотвращена.
Многие хорошие идеи об одном языке часто переносятся на другой язык, такой как «IDisposable / using combo» в C #, который был перенесен в Java 1.7 в его операторе «try (object-to-dispose) {}». Но очень плохо, что языковые архитекторы не могут обнаружить плохую идею, замаскированную под хорошую идею, во время ее передачи от одного к другому.
Мой совет: никогда не используйте ~ Destructor () и придерживайтесь IDisposable / using combo, если вам нужно вручную очистить неуправляемый ресурс, такой как соединения с базой данных.