gpt4 book ai didi

C# GC.Collect 如果对象是使用实例构造函数初始值设定项构造的,则不会销毁该对象

转载 作者:可可西里 更新时间:2023-11-01 08:25:59 29 4
gpt4 key购买 nike

<分区>

Possible Duplicate:
Resurrection difference in using Object Initializer

我很难理解垃圾收集器在 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 中,对象通过了强制 gc 运行,而在测试 2 中却没有。那么,使用初始化器有什么神秘的事情发生吗?我的猜测是,当使用初始化程序时可能会有“一些额外的代码”,这些代码将成为同一对象的强根......

谢谢。

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com