C# 如果this.somefield指的是对象,比如说X,它由";使用;语句,垃圾收集器将来会使X为null吗?

C# 如果this.somefield指的是对象,比如说X,它由";使用;语句,垃圾收集器将来会使X为null吗?,c#,garbage-collection,using,C#,Garbage Collection,Using,有一个c#类有一些字段(p1、p2、p3),在其中一个方法中, p1被初始化为 using(Object X = new Object()){ this.p1 = X ; } 在using block关闭后,垃圾收集器将在任何时候收集X,并且this.p1因此变为null 或 由于this.p1中对X的引用,在应用程序被终止之前,X永远不会变为null吗?只要您在X创建的相同范围内工作,X将永远不会被收集 只要此引用的对象将处于活动状态,X将永远无法收集,因为此。p1引用的是X首先,您没有对X

有一个c#类有一些字段(p1、p2、p3),在其中一个方法中, p1被初始化为

using(Object X = new Object()){
this.p1 = X ;
}
在using block关闭后,垃圾收集器将在任何时候收集X,并且this.p1因此变为null


由于this.p1中对X的引用,在应用程序被终止之前,X永远不会变为null吗?

只要您在
X
创建的相同范围内工作,
X
将永远不会被收集


只要此引用的
对象
将处于活动状态,
X
将永远无法收集,因为
此。p1
引用的是
X

首先,您没有对
X
的引用。内存中有两个对同一对象的引用,一个存储在
X
中,另一个存储在
this.p1
中。只要这些引用中的一个或两个仍然“存在”,该对象就被视为不符合垃圾收集的条件。还请注意,
使用
(如果忽略
对象
未实现
IDisposable
,我将其视为“实现IDisposable的类型”),不会对此对象的垃圾收集产生影响。在此对象上调用
Dispose
(发生在using语句末尾),可能会使该对象清除其对托管和非托管内存的一些内部引用,但该对象本身仍遵循我在其他注释中所述的规则,只要
this.p1
中的引用仍然“存在”,该对象不符合垃圾收集的条件。不,X将不会变为null。如果X仍在使用中,那么X所指的任何东西都不符合垃圾收集的条件。一旦X不再使用,该引用将不再用于保持对象的活动状态(尽管
this.p1
可能),但您也无法再观察X的值。通常,您将使用
X
执行某些操作,因此
this.p1=X。DoSomething()
然后处理
X
是可以的。但您也可以实现
IDisposable
,并将其用于该场景(允许
Dispose()
调用用于其他目的)。至于问题:
p1
都不是真的,
p1
将不会更改其值,除非您设置它,并且由于
p1
将保留引用,它可能会导致内存泄漏,这与
使用
无关,这是关于
的生存期[更正问题]在使用块关闭后,GC是否会收集X?我的理解是因为这里引用了X。P1,X不会像我在回答中所说的那样被gc收集