У меня есть эта небольшая программа (настоящая программа, конечно, сильно отличается).
using System;
namespace Finalizer
{
public class Simple
{
public Simple()
{
Console.WriteLine("Constructor");
}
~Simple()
{
Console.WriteLine("Finalizer");
}
}
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
var s = new Simple();
s = null;
GC.Collect();
Console.WriteLine("Collected");
Console.ReadKey();
}
}
}
И это вывод:
Hello World!
Constructor
Collected
Я не понимаю, почему я не вижу строку Finalizer
.
Кто угодно?
s
, вероятно, все еще находится в стеке. попробуйvoid local() { var s = new Simple(); } local();
- person TheGeneral   schedule 14.02.2021Simple
в отдельный метод, который вы вызываете изMain()
, финализатор будет вызываться для .Net Framework и .Net Core. - person Matthew Watson   schedule 14.02.2021private static Simple simple = new Simple();
). Когда вы устанавливаете его вnull
и вызываетеGC.Collect()
, финализатор запускается немедленно. В .Net Framework это все равно называется. - person Jimi   schedule 14.02.2021GC.Collect(2); GC.WaitForPendingFinalizers(); GC.Collect(2);
из вне функции, которая создает и удаляет объект. И попробуй в релизной сборке. - person Charlieface   schedule 14.02.2021In .NET Framework applications (but not in .NET Core applications), finalizers are also called when the program exits.
- person Matthew Watson   schedule 14.02.2021You have to write finalizers sometimes.
Иногда да. Но очень редко. joeduffyblog.com/2005/12 /27/ Но вы это знаете - вы спорите ради спора. ;) - person mjwills   schedule 17.02.2021