Это деталь реализации .NET 1.x, которая была невероятно трудно избавиться. Часть проблемы должна заключаться в том, что большинство книг о .NET были написаны до 2005 года, все они имеют главу о финализаторах, и все они ошибаются.
Грубо, если вы думаете, что вам нужен финализатор, тогда вы ошибаетесь 99,9% времени. Этот завершаемый ресурс должен быть завернут в свой класс и , что класс должен иметь финализатор. Если вы думаете, вам нужно реализовать одноразовый паттерн, тогда вы ошибаетесь ~ 95% времени. Определенно неправильно здесь. Но иногда у вас нет выбора, если ваш базовый класс уже допустил ошибку при его реализации. У некоторых классов .NET Framework есть эта ошибка, проблема, которую Microsoft не может исправить.
что класс с финализатором в предыдущей главе не один вы должны реализовать себя.Уже было написано: .NET 2.0 приобрел классы SafeHandle
. Вам, в лучшем случае, может потребоваться вывести свой собственный класс, если метод Release() не тот, который уже предоставлен в рамках. SafeBuffer полезен для ресурсов, основанных на указателях.
Большая разница заключается в том, что эти классы довольно особенные, у них есть критические финализаторы. Это дорогое слово, которое означает, что они гарантированно будут работать, даже если поток финализатора бомбит на необработанном исключении. На самом деле это не важно в большинстве приложений LOB, если они спускаются в огонь, тогда очистка ОС обычно достаточно хороша. Но важно, когда .NET-код работает на хосте, который имеет длительную гарантию безотказной работы. SQL Server - хороший пример, нужно перезагрузить его, потому что слишком много кода SQL/CLR, подвергшегося бомбардировке и пропущенным ручкам, плохо для бизнеса.
Деструкторы вызываются не только тогда, когда экземпляр получает сбор мусора, но также и при выходе программы. Если вы попытаетесь получить доступ к некоторым управляемым членам вашего класса, вы можете столкнуться с тем, что некоторые из них уже вызвали деструкторы. – Spo1ler
На всякий случай, когда вы не знали, финализаторы считаются плохой практикой в C# (наряду со многими другими операциями управления памятью, которые разрушают встроенную сборку мусора). См. Шаблон IDisposable в качестве альтернативы (https://msdn.microsoft.com/en-us/library/system.idisposable%28v=vs.110%29.aspx) – Kaido