在介绍编写封装有非托管资源的类时,通常建议下面的规范。显示调用Dispose和隐式调用Dispose的区别在于,显示调用要手工释放托管资源,这是什么道理?如何手工清理托管资源?请例示之,谢谢!
Public class MyClass:IDisposable
{
private bool IsDisposed=false;
public void Dispose()
{
Dispose(true);
GC.SupressFinalize(this);
}
protected void Dispose(bool Diposing)
{
if(!IsDisposed)
{
if(Disposing)
{
//Clean Up managed resources
}
//Clean up unmanaged resources
}
IsDisposed=true;
}
~MyClass()
{
Dispose(false);
}
}
Public class MyClass:IDisposable
{
private bool IsDisposed=false;
public void Dispose()
{
Dispose(true);
GC.SupressFinalize(this);
}
protected void Dispose(bool Diposing)
{
if(!IsDisposed)
{
if(Disposing)
{
//Clean Up managed resources
}
//Clean up unmanaged resources
}
IsDisposed=true;
}
~MyClass()
{
Dispose(false);
}
}
using(...)
{
//do something
}//执行到这里的时候.net会调用你的Dispose方法。
if(Disposing)
{
//Clean Up managed resources
}
Clean Up managed resources是不是通常调用基类的Dispose就可以了
{
obj.Dispose();
}
{
//Clean Up managed resources
} 注释里不就是显示的清除托管资料嘛..
GC.SupressFinalize(this); 是为了不再自动调用析构函数.
用户可以调用DISPOSE,如果忘了,还有析构函数来自动清除.其实上面的写法就是起到了保护的作用,建议用户用DISPOSE,但是如果没有用也没有关系.