मैं कहूंगा कि IDisposable
इंटरफेस आप अगर आप संसाधनों की नियतात्मक निपटान की जरूरत है क्या ढूंढते हैं। यह आमतौर पर अप्रबंधित संसाधनों के मामले में होता है, जैसे अप्रबंधित हैंडल जिन्हें बंद, स्ट्रीम या डेटाबेस कनेक्शन होना आवश्यक है।
C++/CLI में, यदि आप एक प्रबंधित प्रकार (ref class
और की तरह) की घोषणा, IDisposable
नाशक सिंटैक्स का उपयोग कार्यान्वित किया जाता है, और Dispose()
delete
कीवर्ड का उपयोग करके कहा जाता है। आप (^
ऑपरेटर या gcnew
का उपयोग किए बिना) एक कामयाब प्रकार स्थानीय स्तर पर इस तरह के एक वस्तु की घोषणा करते हैं, तो C++/CLI भी आपके लिए अपने आप Dispose()
कॉल जब वस्तु क्षेत्र से बाहर चला जाता है। इस तरह, सी ++/सीएलआई सी # से अधिक सुविधाजनक है।
सी # का उपयोग करते समय आप ऑब्जेक्ट पर delete
पर कॉल करने में सक्षम नहीं होंगे, आपको इसके बजाय मैन्युअल रूप से Dispose()
पर कॉल करने की आवश्यकता होगी। IDisposable
ऑब्जेक्ट्स का निपटान करने का एक और तरीका using
ब्लॉक है।
finalizer (नाशक वाक्य रचना का उपयोग करके सी # में लागू) के बाद से यह निर्धारित करने योग्य नहीं है जब यह कहा जाएगा, एक सी ++ नाशक के रूप में ही नहीं है। फाइनलज़र के साथ ऑब्जेक्ट्स मूल रूप से कतारबद्ध होते हैं जब तक कि फाइनलाइज़र थ्रेड अपने फाइनलाइज़र को कॉल करने का फैसला नहीं करता है, इसलिए प्रभावी रूप से आप इसे कभी भी नहीं जानते हैं जब इसे कहा जाता है।
अप्रबंधित संसाधनों से निपटने के लिए सबसे अच्छा तरीका शायद दोनों का संयोजन है। यहाँ की सिफारिश की दृष्टिकोण के लिए देखें:
http://msdn.microsoft.com/en-us/library/b1yfkh5e(v=vs.100).aspx
ध्यान दें, तथापि, कि जब IDisposable
का उपयोग कर, भले ही आप अप्रबंधित संसाधनों की निर्धारणात्मक नष्ट कर सकें, वस्तुओं अभी भी कचरा कलेक्टर द्वारा एकत्र होने के लिए (गैर निर्धारणात्मक) की जरूरत है में कामयाब रहे।
मैं सिर्फ एक लेख C++/CLI और सी # के बीच इस बात का मतभेद समझा पाया। आपको यह दिलचस्प लगेगा:
http://weblogs.thinktecture.com/cnagel/2006/04/ccli-finalize-and-dispose.html
सी ++/सीएलआई स्टैक अर्थशास्त्र के साथ जेनरेट किए गए आईएल पर अतिरिक्त ध्यान दें या केवल स्थानीय लोगों को न केवल कक्षा के सदस्यों पर काम करें। सी # में डुप्लिकेट करने का कोई आसान तरीका नहीं है। –
यह नहीं पता था (सी ++/सीएलआई का उपयोग अक्सर नहीं)। जानकारी के लिए धन्यवाद :) – Botz3000
मैंने अभी जवाब को दोबारा पढ़ा है और मुझे कुछ स्पष्टीकरण की आवश्यकता है: यदि मेरी कक्षा को सी # (और आईडीआईस्पोज़बल लागू करता है) में परिभाषित किया गया है, तो क्या मैं इसका उपयोग करते समय इसे "हटाएं" पर कॉल कर पाऊंगा एक और सी ++/सीएलआई कक्षा से? धन्यवाद! –