Здесь приведен пример программы, которая демонстрирует удивительное финализации поведение:Почему финализации называется на объекте
class Something
{
public void DoSomething()
{
Console.WriteLine("Doing something");
}
~Something()
{
Console.WriteLine("Called finalizer");
}
}
namespace TestGC
{
class Program
{
static void Main(string[] args)
{
var s = new Something();
s.DoSomething();
GC.Collect();
//GC.WaitForPendingFinalizers();
s.DoSomething();
Console.ReadKey();
}
}
}
Если я запускаю программу, то, что печатается в:
Doing something
Doing something
Called finalizer
Это выглядит, как и ожидалось. Потому что есть ссылка на s после вызова GC.Collect()
, s не является мусором.
Теперь удалите комментарии из строки //GC.WaitForPendingFinalizers();
снова и снова создайте программу.
Я бы не ожидал, что на выходе ничего не изменится. Это потому, что я прочитал, что , если объект обнаружен как мусор, и он имеет финализатор, он будет помещен в очередь финализатора. Поскольку объект не является мусором, то представляется логичным, что его нельзя ставить в очередь финализатора. Таким образом, прокомментированная строка ничего не должна делать.
Однако выход программы:
Doing something
Called finalizer
Doing something
Может кто-нибудь помочь моему пониманию того, почему финализации вызывается?
Действительно, это имело значение. Благодарю. Пример реальной жизни - это более сложная программа C++/CLI, где мне нужен финализатор. – Tony
@Tony: Насколько вы уверены, что вам действительно нужен финализатор? См. Http://webcache.googleusercontent.com/search?q=cache:pS2g2LI5wMAJ:joeduffyblog.com/2005/12/27/never-write-a-finalizer-again-well-almost-never/+&cd=1&hl= Например, en & ct = clnk & gl = uk. –