เริ่มด้วยคลาสที่เรียบง่ายเหล่านี้ ...
สมมติว่าฉันมีชุดเรียนที่เรียบง่ายเช่นนี้:
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
s แต่ละมี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
เป็นสาเหตุของผมมากในการทำงานและเจ้านายของฉันจะสงสัยว่าทำไมฉันต้องเช็คเอาท์เพื่อให้การเปลี่ยนแปลงไปBus
Shoelace
คำถาม
คุณจะป้องกันการแพร่กระจายนี้ได้IDisposable
อย่างไร แต่ยังมั่นใจได้ว่าวัตถุที่ไม่มีการจัดการของคุณถูกกำจัดอย่างเหมาะสม