Я запускаю приведенный ниже код, и результат полностью отличается, когда он запускается в режиме Release. В режиме Debug он никогда не собирает объект класса A и в режиме Reaelse, он сразу же собирает объект класса A.GC.COllect(), похоже, не работает в режиме отладки
Может кто-нибудь объяснить, почему.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication2 {
class Program
{
static void Main(string[] args)
{
A obj = new A();
B bobj = obj.objB;
GC.Collect();
GC.WaitForPendingFinalizers();
while (bobj.isLive)
{
Console.WriteLine("Is Alive!!");
}
Console.WriteLine("Is Dead!!");
Console.ReadLine();
}
}
class A:IDisposable
{
public B objB = new B();
public A()
{ }
~A()
{
objB.Dispose();
}
#region IDisposable Members
public void Dispose()
{
GC.SuppressFinalize(this);
}
#endregion
}
class B:IDisposable
{
public bool isLive = true;
#region IDisposable Members
public void Dispose()
{
this.isLive = false;
GC.SuppressFinalize(this);
}
#endregion
} }
Это не причина. Ссылка не выбрасывается, она считается неактивной, и это не имеет ничего общего с оптимизацией. Это наоборот; переменная может быть оптимизирована от этой точки, поскольку она неактивна. – Guffa
«Брошенный» может быть слишком простым, как объяснение, согласился. Тем не менее, причина верна; в режиме освобождения нет сильной ссылки, которая мешает GC собирать экземпляр. – Lucero
Из-за оптимизаций в режиме выпуска эталонная область действительна только до последнего использования, а не всего блока кода, в котором она определена. Что происходит в режиме отладки, четко указано Лусеро выше. – MSIL