在C#中,类不具有析构函数(destructor)的概念,而是有一种叫做终结器(finalizer)的东西,这在某种程度上和C++的析构函数相似。终结器在对象不再需要时由垃圾收集器自动调用,用于释放非托管资源。在C#中,你不能直接调用终结器,也不能控制它的执行时间。
一个类的终结器不能被继承或重载,每个类只能有一个终结器。它不能带有任何修饰符或参数,并且与类名相同,但前面有一个波浪线(~
)作为前缀。
以下是一个简单的终结器的例子:
public class MyClass
{~MyClass(){// cleanup code here}
}
然而,对于大部分需要清理的情况,.NET提供了IDisposable
接口,它包含一个Dispose
方法,可以由开发者在需要的时候直接调用。使用IDisposable
接口通常是一种更好的选择,因为它提供了对清理过程的更好控制,并且可以在确定不再需要对象时立即释放资源。
以下是一个实现了IDisposable
接口的类的例子:
public class MyClass : IDisposable
{private bool disposed = false;protected virtual void Dispose(bool disposing){if (!disposed){if (disposing){// Dispose managed resources.}// Dispose unmanaged resources.disposed = true;}}public void Dispose(){Dispose(true);GC.SuppressFinalize(this);}~MyClass(){Dispose(false);}
}
在这个例子中,Dispose(bool disposing)
方法是一个受保护的虚方法,由Dispose
方法和终结器调用。它区分了托管资源和非托管资源的清理,因为在终结器中,你不能安全地访问托管资源,因为它们可能已经被垃圾收集器回收。