GC.COllect () не работает в режиме отладки - PullRequest
3 голосов
/ 16 апреля 2009

Я запускаю приведенный ниже код, и результат полностью отличается, когда он работает в режиме выпуска. В режиме отладки он никогда не собирает объект класса A, а в режиме Reaelse он сразу же собирает объект класса A.

Может кто-нибудь объяснить, почему.

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
    } }

Ответы [ 3 ]

4 голосов
/ 16 апреля 2009

В режиме отладки компилятор не оптимизирует локальные переменные. Следовательно, ссылка на A все еще существует. В режиме Release компилятор оптимизировал использование, так что ссылка отбрасывается и объект может быть собран.

3 голосов
/ 01 августа 2012

Я только что обнаружил это поведение в своих тестах. Вставка

obj = null;

прямо перед GC.Collect () должен помочь. Я думаю, что это своего рода "симуляция" оптимизации.

2 голосов
/ 16 апреля 2009

Сборщик мусора по-разному обрабатывает использование переменных в режиме отладки и в режиме выпуска.

В режиме выпуска переменная используется только там, где она фактически используется. После последнего использования varaible объект готов для сбора мусора.

В режиме отладки использование varaible расширено до его объема. Причина этого заключается в том, что окно наблюдения в отладчике может отображать значение переменных во всей области видимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...