【发布时间】:2018-11-21 12:40:10
【问题描述】:
让我们考虑这个类:
public class A<T>
{
private bool _flag;
public Func<T> Function { get; set; } = () => {_flag = true; return _flag; }
}
现在,让我们假设 Function 属性以某种方式访问 _flag 字段,同时在其主体中进行读取和写入。然后,如果我像这样使用 A 类:
public Func<T> SomeFunction()
{
var instance = new A();
return instance.Function;
}
我的问题是真正发生了什么,因为我最初假设该实例将在 SomeFunctions 返回时由 GC 处理,这意味着 _flag 将不复存在,并且该函数将在最终从某个地方调用时尝试访问不存在的字段,但事实并非如此。该代码似乎有效。该字段是否以某种方式保存在闭包中?
感谢您的澄清。
【问题讨论】:
-
更不用说私有修饰符了,一个函数如何访问一个类的实例成员,除非它可以访问实例本身(通过参数、闭包或其他类成员等)?显然,在这种情况下,它与您的示例中
var instance = new A();创建的实例无关。 -
@DmytroMukalov 为了更清晰,我编辑了 A 类 :)
-
在这种情况下,实例将被保留,因为它被其他对象引用。这不是 C++,对象不是在离开作用域时而是在没有其他人引用它时才成为 GC 的主题。
标签: c# scope garbage-collection closures