यह C++/CLI में तो स्पष्ट नहीं है, लेकिन यह काम करता है बिल्कुल जिस तरह से यह सी # में करता है। जब आप ऑब्जेक्ट ब्राउज़र के साथ कक्षा को देखते हैं तो आप इसे देख सकते हैं। या ildasm.exe जैसे एक डिकंपेलर, यह देखने के लिए सबसे अच्छा तरीका है कि यह क्या करता है।
जब आप नाशक लिखना तो C++/CLI संकलक कोड का एक समूह ऑटो उत्पन्न करता है। यह डिस्पोजेबल पैटर्न लागू करता है, आपकी कक्षा स्वचालित रूप से IDISposable लागू करती है, भले ही आपने इसे इस तरह घोषित नहीं किया हो। और आपको एक सार्वजनिक निपटान() विधि, संरक्षित निपटान (बूल) विधि और जीसी :: SuppressFinalize() को स्वचालित कॉल मिलता है।
आप C++/CLI में delete
का उपयोग स्पष्ट रूप से इसे लागू करने की, संकलक एक निपटान() कॉल उत्सर्जन करता है। और तुम ढेर अर्थ विज्ञान का उपयोग करके C++/CLI में आरए II के बराबर मिलता है, संकलक स्वचालित रूप से गुंजाइश ब्लॉक के अंत में निपटान कॉल उत्सर्जन करता है। सिंटेक्स और व्यवहार जो सी ++ प्रोग्रामर से परिचित है।
आप बिल्कुल वही चीज़ आप सी # में क्या चाहते हैं, तो वर्ग है | सी # में लिखा गया है। आप स्पष्ट रूप से आह्वान करने के लिए निपटान() को कॉल करते हैं, आप using
कथन का उपयोग अपवाद-सुरक्षित तरीके से इसे स्पष्ट रूप से करने के लिए करते हैं।
वही नियम अन्यथा लागू होते हैं, आप केवल को को विनाशक की आवश्यकता होती है जब आपको कुछ ऐसी स्मृति रिलीज़ करने की आवश्यकता होती है जो प्रबंधित स्मृति नहीं है। लगभग हमेशा एक मूल वस्तु, जिसे आप कन्स्ट्रक्टर में आवंटित करते हैं। इस बात पर विचार करें कि अगर यह अप्रबंधित वस्तु छोटी है तो यह परेशान नहीं हो सकता है और जीसी :: AddMemoryPressure() एक बहुत ही सभ्य विकल्प है। हालांकि आपको इस तरह के एक रैपर वर्ग में फाइनलाइज़र (!ClassName()
) को लागू करना होगा। आप निपटान() को कॉल करने के लिए बाहरी क्लाइंट कोड को मजबूर नहीं कर सकते हैं, ऐसा करना वैकल्पिक है और इसे अक्सर भुला दिया जाता है। आप इस तरह की निगरानी को एक अप्रबंधित स्मृति रिसाव का कारण नहीं बनना चाहते हैं, फाइनल सुनिश्चित करता है कि यह अभी भी जारी है। आम तौर पर विनाशक को लिखने का सबसे आसान तरीका है अंतिम रूप से अंतिम रूप (this->!ClassName();
)
स्रोत
2011-02-08 16:15:02
मुझे समझ में नहीं आता है कि ['निपटान'] (http://msdn.microsoft.com/en-us/) में क्या गलत है लाइब्रेरी/system.idisposable.dispose.aspx) विधि? आप इसके बिना डिस्पोजेबल पैटर्न को कार्यान्वित नहीं कर सकते हैं। –
सी ++/सीएलआई कक्षा 'निपटान()' विधि का पर्दाफाश नहीं करती है। यह C++/CLI नाशक की तरह वाक्य रचना में निहित है (उदा। '~ MyClass'), लेकिन जब सी # से वस्तु को संदर्भित, आप एक संपर्क में' निपटान() 'विधि की जरूरत नहीं है, के रूप में पास के रूप में मैं बता सकते हैं। – JimEvans