से विरासत में प्राप्त कक्षा में IDISposable इंटरफ़ेस को कैसे कार्यान्वित करें I C# .NET 4.0 में एक विशाल प्रोजेक्ट पर काम करता हूं। System.Net.Sockets.SocketAsyncEventArgs कक्षा से विरासत में प्राप्त एक कस्टम वर्ग है। निम्नलिखित की तरह कुछ:SocketAsyncEventArgs
public class SocketTaskArgs : SocketAsyncEventArgs
{
public SocketTaskArgs()
{
Completed += someEventhHandler;
}
public void CleanUp()
{
Completed -= someEventhHandler;
}
/*
There is a lot of code here that is unimportant at the moment.
*/
}
तो, मैं फेंक करने के लिए (bool) विधि क्लीनअप() विधि की सामग्री ले जाने के लिए चाहता था। SocketAsyncEventArgs (जाओ करने के लिए परिभाषा ताकि मैं स्रोत के रूप में मेटाडाटा देखा उपयोग करते हुए) -
के रूप में पहले, मैं आधार वर्ग के स्रोत कोड की जाँच की। मुझे पता चला, यह वर्ग IDISposable इंटरफ़ेस लागू करता है। अच्छा, मुझे बस निपटान (बूल) विधि को ओवरराइड करने की ज़रूरत है, है ना? (IDisposable Interface on MSDN देखें, अधिक जानकारी के लिए "पहचान योग्य और विरासत पदानुक्रम" अनुभाग। मेरे लिए कोई नई बात नहीं ... दुर्भाग्य से, SocketAsyncEventArgs वर्ग निम्नलिखित के रूप में कार्यान्वित किया जाता है:
public class SocketAsyncEventArgs : EventArgs, IDisposable
{
public void Dispose();
//some other stuff here
}
इसका मतलब है, कोई रास्ता नहीं कैसे ओवरराइड करने के लिए है निपटान (bool) विधि, के रूप में यह रूप में निजी बजाय लागू हो जाता है संरक्षित ... इसका कारण क्या है?
अगला, मैंने एमएसडीएन पर SocketAsyncEventArgs.Dispose() विधि पढ़ी।
नोट्स उत्तराधिकारियों को
निपटान अन्य वस्तुओं से कई बार कहा जा सकता है: अजीब बात यह है कि, यह निम्न अनुभाग होता है। ओवरराइड करते समय (बूलियन), सावधान रहें ऑब्जेक्ट्स को संदर्भित न करें जिन्हें पहले पर पहले कॉल में निपटाया गया था का निपटान करें। को कार्यान्वित करने के तरीके के बारे में अधिक जानकारी के लिए (बूलियन), एक निपटान विधि को कार्यान्वित करना देखें।
रुको ... क्या?
जब निपटान (बूलियन), अधिभावी ...
मैं कैसे निपटान (बूलियन) ओवरराइड करना चाहिए?
इस मामले में आईडीस्पोजेबल इंटरफेस को लागू करने के लिए अनुशंसित तरीका क्या है?
यह निजी नहीं है, यह बिल्कुल लागू नहीं हुआ है (http://referencesource.microsoft.com/System/net/System/Net/Sockets/Socket.cs.html#8877 देखें)। यह एक फाइनलाइज़र का उपयोग करता है लेकिन ऐसा लगता है कि इसे वास्तव में अनुशंसित पैटर्न में लागू नहीं किया गया था। –
ऐसा लगता है कि 'निपटान' सार्वजनिक है, सिर्फ 'आभासी' नहीं। –
आपको उस कक्षा से उत्तराधिकारी नहीं होना चाहिए। आप शायद एक बड़ी मौजूदा परियोजना में आसानी से इसे बदल नहीं सकते हैं। – usr