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)
我使对象objObjectToClassA到null我已经导致相信这是相当于object = nothing在VB.NET.
objObectToClassA = null;
Run Code Online (Sandbox Code Playgroud)
这个动作也会破坏objObjectToClass1吗?
不是这样,不.垃圾收集器在有资格收集后的某个时间将回收对象.这可能是在你清除了它的最后一个引用之后,但如果你在某个点之后再也不需要引用它可能已经存在了.但通常,设置存储实例的字段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)