.NET中的析构函数

时间:2016-08-12 09:51:41

标签: c# destructor

很长一段时间以来,NET已经开始学习C#了。我想我多年前曾经问过的一件事,得到了答案,但现在完全忘记了它,因为它不是我暗中使用的东西是析构函数。当我正在学习C#时,我读了一篇关于如何在C#中创建它们的文章,但它让我感到疑惑。假设我实例化一个具有另一个类的对象的类。

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

4 个答案:

答案 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