Как можно определить код, который хранит «это» во время завершения класса? Как должен вести себя сборщик мусора (, если он определен где-то )?
На мой взгляд, GC должен несколько раз финализировать экземпляр класса, а следующее тестовое приложение должно напечатать «66», но финализатор выполняется только один раз, в результате чего приложение напечатает «6».
Несколько строк кода:
using System;
namespace Test
{
class Finalized
{
~Finalized()
{
Program.mFinalized = this;
}
public int X = 5;
}
class Program
{
public static Finalized mFinalized = null;
static void Main(string[] args)
{
Finalized asd = new Finalized();
asd.X = 6;
asd = null;
GC.Collect();
if (mFinalized != null)
Console.Write("{0}", mFinalized.X);
mFinalized = null;
GC.Collect();
if (mFinalized != null)
Console.Write("{0}", mFinalized.X);
}
}
}
Я пытаюсь понять, как финализаторы управляют памятью экземпляра. В моем приложении может быть желательно повторно -использовать ссылку на экземпляр для дальнейшей обработки.
Понятно, что финализатор не "освобождает" память (, по крайней мере, в моем тестовом приложении ). Можно ли повторно использовать кусок памяти для других целей? Или даже освободили? А если нет, то это утечка памяти или что?
Теперь я запутался больше, чем раньше.