析构函数执行在类的实例被销毁之前清理或释放托管资源,与c++的析构函数不同,c#的析构函数不在实例失效时立即执行。
事实上我们不知道,他到底什么时候调用,而且也不能认为显示的调用析构函数。如果我们的系统需要他,则我们必须也要
为系统提供,系统会在对象从托管的堆中移走之前的某点调用它。
1.如果我们的代码中包含了需要及时清理的非托管资源,不要把它仅仅交给析构函数去处理,因为这样不能够即时清理它,我
们应该在类中实现名为IDispose的接口,接口将资源的清理代码封装在一个void 型的无参数方法Dispose中。
2.因为Dispose做清理而不是析构函数,所以应当调用GC.SuppressFinalize(),调用方法告诉CLR不要调用该方法的析构函数,
应为资源已经被清理了。
Class MyClass:IDispose
{
bool disposed=false;
public void Dispose()
{
Dispose(true);
GC.SuppressFinallize();
}
~MyClass(){Dispose(false)};
protected virtual void Dispose(bool disposing)
{
if(disposed==false)
{
if(disposing)
{
//清理托管资源
}
//清理非托管资源
}
disposed=true;
}
}