.NET中的析构函数

alt*_*ein 2 c# destructor

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

Class C1
{
  // Do something here
}

Class A
{
  C1 objObjectToClass1 = new C1();
}   

Class Main
{
   A objObjectToClassA = new A();
}
Run Code Online (Sandbox Code Playgroud)

我使对象objObjectToClassAnull我已经导致相信这是相当于object = nothing在VB.NET.

objObectToClassA = null;
Run Code Online (Sandbox Code Playgroud)

这个动作也会破坏objObjectToClass1吗?

Joe*_*oey 5

不是这样,不.垃圾收集器在有资格收集后的某个时间将回收对象.这可能是在你清除了它的最后一个引用之后,但如果你在某个点之后再也不需要引用它可能已经存在了.但通常,设置存储实例的字段null将有助于使对象不再可访问并回收.

通常,您无法控制GC何时回收对象.您可以编写终结器,它们是在回收对象之前调用的方法,但如果您可以帮助它,我非常推荐它.如果您需要一种可预测的方法来使对象释放它可能保留的任何资源(C++中的析构函数经常这样做),那么实现该IDisposable接口:

class C1 : IDisposable {
  public void Dispose() {
    // Do cleanup here
  }
}
Run Code Online (Sandbox Code Playgroud)

这也使您能够在using语句中使用该类的实例,该语句Dispose在其块的末尾调用:

using (var c1 = new C1()) {
  // do stuf with c1 here
} // at this point c1.Dispose() is automatically called
Run Code Online (Sandbox Code Playgroud)