我正在运行下面的代码,当它在 Release 模式下运行时,结果完全不同。在 Debug 模式下,它从不收集 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
    } }

最佳答案

在 Debug模式下,编译器不会优化局部变量。因此,对 A 的引用仍然存在。在Release 模式下,编译器优化了用法,以便丢弃引用并收集对象。

关于.net - GC.COllect() 似乎在 Debug模式下不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/755680/

10-12 14:59