इन सरल कक्षाओं से शुरू करें ...
मान लीजिए कि मेरे पास कक्षाओं का एक सरल सेट है:
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
पास a है Driver
, Driver
दो Shoe
s है, प्रत्येक के Shoe
पास a है Shoelace
। सब बहुत मूर्खतापूर्ण।
Shoelace के लिए एक IDisposable ऑब्जेक्ट जोड़ें
बाद में मैंने फैसला किया कि कुछ ऑपरेशन Shoelace
मल्टी-थ्रेडेड हो सकते हैं, इसलिए मैं EventWaitHandle
थ्रेड्स के साथ संवाद करने के लिए जोड़ता हूं । तो Shoelace
अब ऐसा दिखता है:
class Shoelace
{
private AutoResetEvent waitHandle = new AutoResetEvent(false);
bool tied = false;
// ... other stuff ..
}
Shoelace पर आईडिसोपल लागू करें
लेकिन अब Microsoft का FxCop शिकायत करेगा: "'Shoelace' पर IDisposable को लागू करें क्योंकि यह निम्नलिखित 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)
और नाशक:
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
बनाता है Driver
तो Bus
होना चाहिए IDisposable
और इतने पर।
अचानक मेरे छोटे परिवर्तन से Shoelace
मुझे बहुत काम मिल रहा है और मेरे बॉस सोच रहे हैं कि मुझे Bus
बदलाव करने के लिए चेकआउट करने की आवश्यकता क्यों है Shoelace
।
प्रश्न
आप इस प्रसार को कैसे रोक सकते हैं IDisposable
, लेकिन फिर भी यह सुनिश्चित करें कि आपकी अप्रबंधित वस्तुएं ठीक से निपटें?