เริ่มด้วยคลาสที่เรียบง่ายเหล่านี้ ...
สมมติว่าฉันมีชุดเรียนที่เรียบง่ายเช่นนี้:
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มีสองShoes แต่ละมีShoe Shoelaceทั้งหมดโง่มาก  
เพิ่มวัตถุ IDisposable ใน Shoelace
ต่อมาฉันตัดสินใจว่าการดำเนินการบางอย่างเกี่ยวกับShoelaceอาจเป็นหลายเธรดดังนั้นฉันจึงเพิ่มEventWaitHandleสำหรับเธรดที่จะสื่อสารด้วย ดังนั้นShoelaceตอนนี้ดูเหมือนว่านี้:
class Shoelace
{
    private AutoResetEvent waitHandle = new AutoResetEvent(false);
    bool tied = false;
    // ... other stuff ..
}
ติดตั้ง IDisposable บนเชือกผูกรองเท้า
แต่ตอนนี้FxCop ของ Microsoftจะบ่นว่า: "Implement 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(bool)และ Destructor:
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);
    }
}
ดูในหนังสยองขวัญในขณะที่ IDisposablek แพร่กระจาย
ใช่แล้วนั่นคือการแก้ไข แต่ตอนนี้ FxCop จะบ่นว่าShoeสร้าง a Shoelaceดังนั้นShoeต้องเป็นIDisposableเช่นกัน
และDriverสร้างShoeจึงต้องDriver IDisposableและBusสร้างDriverดังนั้นBusจะต้องเป็นIDisposableและอื่น ๆ
ทันใดนั้นการเปลี่ยนแปลงขนาดเล็กของฉันที่จะShoelaceเป็นสาเหตุของผมมากในการทำงานและเจ้านายของฉันจะสงสัยว่าทำไมฉันต้องเช็คเอาท์เพื่อให้การเปลี่ยนแปลงไปBusShoelace
คำถาม
คุณจะป้องกันการแพร่กระจายนี้ได้IDisposableอย่างไร แต่ยังมั่นใจได้ว่าวัตถุที่ไม่มีการจัดการของคุณถูกกำจัดอย่างเหมาะสม