可能重复:
使用对象初始化器的复活差异
我很难理解垃圾收集器在 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);
}
输出为真/真/真/假
在我看来,在这两个测试中,堆上的对象在调用 GC.Collect 之前没有根。但是碰巧在测试 1 中,对象通过了 force gc 运行,而在测试 2 中则没有。那么,使用初始化程序有什么神秘之处吗?我的猜测是,使用初始化程序时可能会有“一些额外的代码”,这将成为同一对象的强根.....
谢谢。