C# 引用类型在方法中存在多长时间?

use*_*950 2 c# garbage-collection heap-memory

我找不到明确的答案。如果我在一个方法中实例化一个引用类型但没有将它存储在任何类变量上,那么这个引用在堆上存在多久?它是否在方法返回时标记为垃圾并最终被垃圾收集器清除?

void DoSomeStuff()
{
   var myRefInstance = new Object();
}
Run Code Online (Sandbox Code Playgroud)

InB*_*een 5

不可访问的对象被标记为可收集。对象何时被回收取决于GC;如果没有内存压力,它可能永远不会被收集,直到应用程序结束。

重要的是要注意规则是“对象不可访问”,而不是没有指向它的引用,这是不一样的:

void Foo() {
    var a = new A();
    var b = new B();
    a.b = b;
    b.a = a; }
Run Code Online (Sandbox Code Playgroud)

双方ab会被标记为不可访问时Foo退出,即使双方将有一个引用计数器大于0。

  • 只是向读者澄清一下:GC 本身将事物(名义上)标记为可收集/不可收集,因此当该部分发生时也是:取决于 GC 的奇思妙想 (2认同)