最佳答案
                                        
                                                                        
                                假设我有一组这样的简单类:
class Bus
{
Driver busDriver = new Driver();
}
class Driver
{
Shoe[] shoes = { new Shoe(), new Shoe() };
}
class Shoe
{
Shoelace lace = new Shoelace();
}
class Shoelace
{
bool tied = false;
}
一个 Bus有一个 Driver,Driver有两个 Shoe,每个 Shoe有一个 Shoelace。都很傻。
后来我决定在 Shoelace上的某些操作可以是多线程的,所以我添加了一个 EventWaitHandle来与线程进行通信。Shoelace现在看起来是这样的:
class Shoelace
{
private AutoResetEvent waitHandle = new AutoResetEvent(false);
bool tied = false;
// ... other stuff ..
}
但是现在 微软的 FxCop会抱怨: “在‘ Shoelace’上实现 IDisposable,因为它创建下列 IDisposable 类型的成员: ‘ EventWaitHandle’”
好吧,我在 Shoelace上实现了 IDisposable,然后我整洁的小类变成了这个可怕的混乱:
class Shoelace : IDisposable
{
private AutoResetEvent waitHandle = new AutoResetEvent(false);
bool tied = false;
private bool disposed = false;
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
~Shoelace()
{
Dispose(false);
}
protected virtual void Dispose(bool disposing)
{
if (!this.disposed)
{
if (disposing)
{
if (waitHandle != null)
{
waitHandle.Close();
waitHandle = null;
}
}
// No unmanaged resources to release otherwise they'd go here.
}
disposed = true;
}
}
或者(正如评论者指出的那样) ,由于 Shoelace本身没有非托管资源,我可以使用更简单的处置实现,而不需要 Dispose(bool)和析构函数:
class Shoelace : IDisposable
{
private AutoResetEvent waitHandle = new AutoResetEvent(false);
bool tied = false;
public void Dispose()
{
if (waitHandle != null)
{
waitHandle.Close();
waitHandle = null;
}
GC.SuppressFinalize(this);
}
}
对,就是这样。但是现在 FxCop 会抱怨 Shoe创建了一个 Shoelace,所以 Shoe也必须是 IDisposable。
Driver创建 Shoe,所以 Driver必须是 IDisposable。
Bus创建 Driver,所以 Bus必须是 IDisposable,以此类推。
突然之间,我对 Shoelace的小改变给我带来了很多工作,我的老板想知道为什么我需要检查 Bus来改变 Shoelace。
如何防止 IDisposable的这种扩散,但仍然确保正确地处置非托管对象?
 
                                
                             
                                
                             
                                
                             
                                
                             
                                
                             
                                
                            