从这些简单的类开始...
假设我有一组简单的类,如下所示:
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;
}
A Bus有一个Driver,A 有Driver两个Shoe,每个Shoe都有一个Shoelace。一切都很傻。  
将IDisposable对象添加到Shoelace
后来我决定对进行某些操作Shoelace可以是多线程的,因此我EventWaitHandle为线程添加了一个与之通信。所以Shoelace现在看起来像这样:
class Shoelace
{
    private AutoResetEvent waitHandle = new AutoResetEvent(false);
    bool tied = false;
    // ... other stuff ..
}
在鞋带上实现IDisposable
但是现在,Microsoft的FxCop会抱怨:“将IDisposable实施在'Shoelace'上,因为它创建了以下IDisposable类型的成员:'EventWaitHandle'。”
好吧,我实现了IDisposable在Shoelace和我的整洁的小类成为这个乌七八糟:
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实现,而无需Dispose(bool)and析构函数:
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);
    }
}
恐怖地看着IDisposable传播
没错,就是这样。但是现在FxCop会抱怨Shoe创建一个Shoelace,所以也Shoe必须IDisposable如此。
而Driver创造Shoe如此Driver必须IDisposable。并因此必须如此Bus创建。DriverBusIDisposable
突然我的零钱Shoelace引起了我很多工作,我的老板想知道为什么我需要结账Bus才能更改Shoelace。
问题
如何防止扩散IDisposable,但仍要确保正确处理非托管对象?