इन सरल कक्षाओं से शुरू करें ...
मान लीजिए कि मेरे पास कक्षाओं का एक सरल सेट है:
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दो Shoes है, प्रत्येक के 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, लेकिन फिर भी यह सुनिश्चित करें कि आपकी अप्रबंधित वस्तुएं ठीक से निपटें?