आप क्या कर रहे हैं सी ++ और आरएआईआई की तरह है। और सी # में, यह करीब है कि सी ++/आरएआईआई मुहावरे जैसा आप प्राप्त कर सकते हैं।
एरिक लिपर्ट, जो सी # के बारे में एक चीज़ या दो को जानता है, आईडीआईएस का उपयोग करने और सी # आरएआईआई मुहावरे के रूप में कथन का उपयोग करने के खिलाफ है। यहां उसकी गहराई से प्रतिक्रिया देखें, Is it abusive to use IDisposable and "using" as a means for getting "scoped behavior" for exception safety?।
इस आरएआईआई फैशन में उपयोग किए जाने वाले आईडीस्पोजेबल के साथ समस्या का एक हिस्सा यह है कि IDisposable में सही तरीके से उपयोग करने के लिए बहुत कठोर आवश्यकताएं हैं। लगभग सभी सी # कोड मैंने देखा है कि IDISposable का उपयोग पैटर्न को सही ढंग से कार्यान्वित करने में विफल रहता है। जो डफी ने एक ब्लॉग पोस्ट किया है जो IDISposable पैटर्न http://joeduffyblog.com/2005/04/08/dg-update-dispose-finalization-and-resource-management/ को लागू करने के उचित तरीके के बारे में सावधानीपूर्वक विस्तार में जाता है। जो की जानकारी एमएसडीएन पर उल्लिखित की तुलना में अधिक विस्तृत और व्यापक है। जो सी # के बारे में कुछ भी जानता है, और वहां बहुत सारे स्मार्ट योगदानकर्ता थे जिन्होंने उस दस्तावेज़ को दूर करने में मदद की।
बेयर-हड्डियों-न्यूनतम आईडीस्पोजेबल पैटर्न (आरएआईआई जैसे उपयोग के लिए) जैसे वर्ग को सील करने के लिए सरल चीजें की जा सकती हैं, और चूंकि कोई अप्रबंधित संसाधन नहीं है, जिसमें फाइनेंजर नहीं है, और ऐसे में। एमएसडीएन https://msdn.microsoft.com/en-us/library/system.objectdisposedexception%28v=vs.110%29.aspx एक अच्छा अवलोकन है, लेकिन जो की जानकारी में सभी गौरी विवरण हैं।
लेकिन एक चीज जिसे आप आईडीस्पोजेबल से दूर नहीं ले सकते हैं, इसकी "वायरल" प्रकृति है। जिन वर्गों को एक ऐसे सदस्य पर रखा जाता है जो स्वयं को पहचानने योग्य है, उसे IDIS39able योग्य होना चाहिए ... using(RAII raii = Pool.GetRAII())
परिदृश्य में कोई समस्या नहीं है, लेकिन कुछ के बारे में बहुत सावधान रहना चाहिए।
एरिक की स्थिति के बावजूद, जो कि मैं अन्य सभी चीज़ों पर उससे सहमत हूं) और जो के 50 पृष्ठ निबंध IDISposable पैटर्न को सही ढंग से कार्यान्वित करने के तरीके के बारे में कहा जा रहा है ... मैं इसे सी #/RAII idiom खुद।
अब केवल अगर सी # था 1) गैर-शून्य संदर्भ (जैसे सी ++ या डी या स्पेक #) और 2) गहराई से अपरिवर्तनीय डेटा प्रकार (जैसे डी, या यहां तक कि एफ # [ आप एफ # प्रकार में अपरिवर्तनीय सी # , लेकिन यह बॉयलरप्लेट का एक बहुत सी है, और यह सही पाने के लिए बहुत मुश्किल है ...आसान हार्ड, और हार्ड असंभव]) और 3) भाषा के हिस्से के रूप में डिज़ाइन-बाय-कॉन्ट्रैक्ट (जैसे डी या एफिल या स्पेक #, सी # कोड अनुबंध घृणा की तरह नहीं) बनाता है। श्वास शायद सी # 7.
कॉलिंग निपटान() * हमेशा * वैकल्पिक है। क्या होगा जब क्लाइंट प्रोग्राम इसे कॉल नहीं करता है? देखना मुश्किल है कि कुछ "खराब" नहीं होता है। फाइनलाइज़र निपटान() का उपयोग नहीं किया जा रहा है, किसी भी तरह से आप Finalizer में रिलीज रिसोर्स() को कॉल नहीं कर सकते हैं। –