小编ale*_*231的帖子

C#GC.Collect如果使用实例构造函数初始化程序构造它,则不会销毁该对象

可能重复:
使用对象初始化程序的复活差异

我很难理解垃圾收集器在C#中是如何工作的(我使用的是2012,所以c#4.5).这是我的示例代码:

    public class A
    {
        public int c;
        public A(){}
        public A(int pC)
        {
            c = pC;
        }
    }

    public static void Main()
    {
        // Test 1
        var a = new A {c=199};
        var aRef = new WeakReference(a);
        a = null;
        Console.WriteLine(aRef.IsAlive);
        GC.Collect();
        Console.WriteLine(aRef.IsAlive);
        //            Console.WriteLine(GC.GetGeneration(aRef.Target)); //output 1

        // Test 2
        a = new A (200);
        aRef = new WeakReference(a);
        a = null;
        Console.WriteLine(aRef.IsAlive);
        GC.Collect();
        Console.WriteLine(aRef.IsAlive);
    }
Run Code Online (Sandbox Code Playgroud)

输出为True/True/True/False

在我看来,在两个测试中,在调用GC.Collect之前,堆上的对象没有root.但实际上,在测试1中,对象通过强制gc运行,而在测试2中却没有.那么,使用初始化器有什么神秘感吗?我的猜测是,当使用初始化程序时,可能会有"一些额外的代码",它将成为同一个对象的强根.....

谢谢.

.net c# garbage-collection weak-references

12
推荐指数
2
解决办法
1428
查看次数

标签 统计

.net ×1

c# ×1

garbage-collection ×1

weak-references ×1