Class C1
{
// Do something here
}
Class A
{
C1 objObjectToClass1 = new C1();
}
Class Main
{
A objObjectToClassA = new A();
}
我将对象objObjectToClassA
设为null
,因为我一直认为这相当于VB.NET中的object = nothing
。
objObectToClassA = null;
此操作是否还会破坏objObjectToClass1
?
答案 0 :(得分:5)
不是这样,不。垃圾收集器在有资格收集后的某个时间将回收对象。这可能是在您清除了对它的最后一个引用之后,但如果您在某个点之后再也不需要引用,那么它可能已经存在。但通常情况下,设置将实例存储到null
的字段将有助于使对象无法再访问并回收。
通常,您无法控制GC回收对象的时间。您可以编写终结器,它们是在回收对象之前调用的方法,但如果您可以帮助它,我会非常不推荐它。如果您需要一种可预测的方法来使对象释放它可能保留的任何资源(C ++中的析构函数经常这样做),那么实现IDisposable
interface:
class C1 : IDisposable {
public void Dispose() {
// Do cleanup here
}
}
这也使您能够在using
statement中使用该类的实例,它将在其块的末尾调用Dispose
:
using (var c1 = new C1()) {
// do stuf with c1 here
} // at this point c1.Dispose() is automatically called
答案 1 :(得分:2)
垃圾收集器知道什么时候不再有对象的引用,据我所知,它甚至会破坏只被另一个引用的对象。
这意味着如果你取消引用objObjectToClassA
(将其设置为null
),如果没有对任何一个对象的引用,那么两个对象都将被销毁。简单地让它超出范围就足够了。
答案 2 :(得分:1)
实际上,是的,它也会破坏objectToClass1
,但不会立即销毁。在这种情况下,将变量设置为null意味着您的应用程序不再使用该对象,因此它有资格进行垃圾回收。简单地考虑它(我确信GC比这更聪明),一旦收集objectToClassA
,就不再引用objectToClass1
并且也将收集它。
乔伊关于IDisposable
的评论绝对值得记住;尽量不考虑C#的终结者,因为你无法控制它们的运行时间。使用IDisposable
将为您提供所需的控件,以便整理资源。
答案 3 :(得分:0)
Destroy是错误的单词,C#(据我所知)在C ++意义上没有析构函数。垃圾收集器不再收集/“销毁”不再使用的对象。
如果未保留对objObjectToClass1
的其他引用,如果您将objObjectToClass1
设置为objObectToClassA
null