मेरी कक्षा में इंटरऑप से एक ऑब्जेक्ट होता है और उस पर एक विधि कॉल करता है जो इसे सामान आवंटित करता है। यह भी है कि सामान को मुक्त करने के लिए एक विधि को उजागर करता है, तो मैं उम्मीद मैं निपटान() में इस फोन करना चाहिए:इंटरऑप COM ऑब्जेक्ट को लपेटते समय मैं C# में निपटान पैटर्न को कैसे कार्यान्वित करूं?
class MyClass : IDisposable
{
private DllName.ComClassName comInstance;
void SomeMethod()
{
comInstance = new DllName.ComClassName();
comInstance.AllocStuff();
}
public void Dispose()
{
comInstance.FreeThatStuff();
}
}
अब, मैं वह सब का विस्तार करना चाहिए निपटान पैटर्न का पालन करने के लिए। मैं कोई अन्य डिस्पोजेबल या अप्रबंधित संसाधन जारी करने के लिए है, तो यह मानते हुए कि comInstance प्रबंधित किया जाता है (कि क्या इंटरॉप नहीं करता है, प्रबंधित में अप्रबंधित लपेटता?), मैं करने के लिए पैटर्न disolves लगता है:
public void Dispose()
{
if (comInstance != null)
{
comInstance.FreeStuff();
comInstance = null;
}
}
कौन सा जब तक कि मैं लीक स्पष्ट रूप से MyClass के उदाहरणों पर निपटान() को कॉल करें, जो निपटान पैटर्न को त्रुटिपूर्ण कर देगा? तो इसका मतलब यह है comInstance अप्रबंधित होना चाहिए, और पैटर्न के लिए disolves:
public void Dispose()
{
DisposeComInstance();
GC.SuppressFinalize(this);
}
~MyClass()
{
DisposeComInstance();
}
private void DisposeComInstance()
{
if (comInstance != null)
{
comInstance.FreeStuff();
comInstance = null;
}
}
संपादित करें:
- पूरा पैटर्न के साथ मेरी कक्षा को अव्यवस्थित बचने के लिए, मैं सिर्फ अपनी कक्षा को सील कर सकता है?
- मुझे कैसे पता चलेगा ComClassName (और सामान्य रूप से किसी भी वर्ग) अप्रबंधित है?
मेटा-टिप्पणी: सुनिश्चित करें कि आपका निपटान (बूल) पंक्ति में कई बार बुलाया जा सकता है। एक अपवाद को फेंकने की संभावना को कम करने की कोशिश करें (हमेशा संभव नहीं)। – user7116
मेटा-मेटा टिप्पणी - साथ ही साथ, यह महत्वपूर्ण है कि आप कभी भी ताले हासिल न करें या अपने अप्रबंधित सफाई के दौरान लॉकिंग का उपयोग न करें। – womp