Laz*_*zlo 9 c# dispose finalize
假设这是传统的Dispose模式(取自devx,但在许多网站上看到)
class Test : IDisposable
{
private bool isDisposed = false;
~Test()
{
Dispose(false);
}
protected void Dispose(bool disposing)
{
if (disposing)
{
// Code to dispose the managed resources of the class
}
// Code to dispose the un-managed resources of the class
isDisposed = true;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
Run Code Online (Sandbox Code Playgroud)
我不明白为什么打电话GC.SupressFinalize(this)
.这需要我编写自己的托管资源处理,包括清空我的引用?我必须承认,我有点迷茫.有人会对这种模式有所了解吗?
理想情况下,我只想处理我的非托管资源,让GC自己进行托管收集.
实际上,我甚至不知道为什么我们指定一个终结器.在任何情况下,编码人员都应该自己处理,现在不应该他?如果这只是一个后备机制,我会删除它.
Luk*_*keH 14
使用该IDisposable
模式,以便Dispose
在客户端代码调用该方法时,对象可以确定性地清理其资源.
如果客户端代码Dispose
由于某种原因无法调用,则终结器仅作为后备.
如果客户端代码调用,Dispose
那么随后执行资源的清理,并且在完成期间不需要再次执行.SuppressFinalize
在这种情况下调用意味着该对象不再需要额外的GC终结成本.
而且,如果你自己的类只使用管理资源,那么finaliser是完全没有必要的:GC将采取任何管理资源的照顾,让这些资源本身担心是否他们需要一个备用finaliser.如果它直接处理非托管资源,您应该只考虑自己类中的终结器.