Вы должны включать финализатор только в том случае, если у вас абсолютно есть для выполнения некоторой очистки в какой-то момент, независимо от того, выполняется оно явно или нет.В таких случаях у вас всегда должен быть явный способ своевременно выполнить очистку, и это в любом случае должно подавлять завершение, чтобы «хорошие» клиенты не видели никакого снижения производительности.
Вы быобычно нужен финализатор, только если у вас есть прямой дескриптор неуправляемых ресурсов - если у вас есть только ссылка на другой класс , который имеет дескриптор ресурса (например, FileStream
), тогда вы должны оставить егов другом классе есть финализатор.
С появлением SafeHandle
в .NET 2.0 ситуации, когда стоит написать свой собственный финализатор, очень редки .
Снижение производительности финализаторов заключается в том, что они заставляют ваши объекты жить дольше, чем нужно: в первом цикле сборщика мусора, когда они в противном случае считаются подходящими для сбора, они попадают в очередь финализатора - и сталкиваютсядо следующего поколения, как и любой другой объект, который переживает цикл ГХ.Финализатор затем будет запущен в другом потоке (в какой-то момент), и только , тогда они будут иметь право быть действительно собранным.Таким образом, вместо того, чтобы (скажем) собираться в первую коллекцию gen1, они живут прошлым до следующей коллекции gen2 , которая может быть значительно позже.