Я экспериментировал с использованием класса WeakReference, но не ожидал, что он не удержит объект от следующей сборки мусора. Почему?
У меня нет знаний о практическом использовании этого класса.
Код вызывает другую сборку мусора после того, как я установил для myObject значение null.
Редактировать: В конце else, если строка myObject не расположена, это потому, что компилятор знает, что объект WeakReference wr все еще используется в коде, так что сборщик мусора не возвращает его?
class Program
{
static void Main(string[] args)
{
MyObject myObject = new MyObject(25);
WeakReference wr = new WeakReference(myObject);
if (wr.IsAlive) Console.WriteLine("Alive");
myObject = null;
GC.Collect();
if (wr.IsAlive) Console.WriteLine("Still alive");
else if(!wr.IsAlive) Console.WriteLine("Dead");
//
//edit: added this
GC.Collect();
if (wr.IsAlive) Console.WriteLine("Still alive");
else if (!wr.IsAlive) Console.WriteLine("Dead");
//edit end
Console.ReadKey();
}
}
class MyObject : IDisposable
{
private bool disposed = false;
private int id = 0;
public MyObject(int id)
{
this.id = id;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected void Dispose(bool disposing)
{
Console.WriteLine("disposed {0}", id);
if (!disposed)
{
if (disposing)
{
//free managed
}
//free unmanaged
disposed = true;
}
}
~MyObject()
{
Dispose(false);
}
}