2011-10-18 8 views
11

मैंने सी # में फाइनलाइज़र और IDisposable के बारे में बहुत कुछ पढ़ा है। जैसे ही मैं आखिरकार फाइनलाइज़र और IDisposable पर इस राक्षसी भ्रम से स्पष्ट हो गया, अचानक, कहीं से भी, यह सेफहैंडल चीज़ नहीं है। मेरा विश्वास पूरी तरह से हिल गया है। मुझे क्या उपयोग करना चाहिए?सी # उपयोग आईडीस्पोजेबल या सेफहैंडल?

+2

* क्या * के लिए उपयोग करें, बिल्कुल? –

+0

क्या, बिल्कुल के लिए उपयोग करें। मुझे नहीं पता कि मुझे किस स्थिति में अब उपयोग करना चाहिए कि ऐसी 2 समान प्रतीत होती है। –

+1

@ हंसपैसेंट आईडीएसओएसपीबल को कार्यान्वित करने के तरीके के बारे में एमएसडीएन पोस्ट पढ़ने पर, माइक्रोसॉफ्ट दो विकल्पों को प्रस्तुत करता है कि इसे कैसे कार्यान्वित किया जाए। एक फाइनेंजर को कार्यान्वित कर रहा है, और अनुशंसित एक सेफहैंडल का उपयोग कर रहा है। यह वास्तव में थोड़ा उलझन में और भ्रामक है, इसलिए मैं ओपी के सवाल को बहुत अच्छी तरह समझ सकता हूं। यूआरएल: http://msdn.microsoft.com/en-us/en-en/library/fs2xkftw%28v=vs.110%29.aspx वेबसाइट इसे बहुत सामान्य बनाती है, इसलिए मेरी पहली कोशिश करने का मेरा पहला प्रयास पेन ऑब्जेक्ट्स का सही ढंग से निपटान किया गया था, सेफहैंडल के साथ भी, जो बहुत उत्पादक नहीं था। – Tom

उत्तर

15

SafeHandle केवल Win32 इंटरऑप कॉल से निपटने के दौरान उपयोगी है। Win32 में, अधिकांश चीजें "हैंडल" द्वारा दर्शायी जाती हैं। इसमें विंडोज, म्यूटेक्स इत्यादि शामिल हैं। इसलिए .NET SafeHandle Win32 हैंडल को ठीक से बंद करने के लिए डिस्पोजेबल पैटर्न का उपयोग करता है।

तो यदि आप Win32 इंटरऑप कॉल का उपयोग कर रहे हैं और Win32 हैंडल वापस प्राप्त कर रहे हैं, तो SafeHandle का उपयोग करें। अपनी खुद की वस्तुओं के लिए, आप IDisposable और एक अंतिमकरण के साथ रहना होगा।

+0

लेकिन [IDISposable] का पूरा बिंदु (https://msdn.microsoft.com/en-us/library/system.idisposable (v = vs.110) .aspx), * अप्रबंधित * संसाधनों को रिलीज़ करना है, नहीं है यह? "आपकी खुद की वस्तुएं" संदिग्ध लगती हैं, क्योंकि ऑब्जेक्ट एक प्रबंधित * और * अप्रबंधित ऑब्जेक्ट दोनों का प्रतिनिधित्व कर सकता है, और तब से, आप डेवलपर, मैंगड और अप्रबंधित कोड दोनों विकसित कर सकते हैं और अपने प्रबंधित कोड से अपने अप्रबंधित कोड को "स्वयं" भी धुंधला है। –

+0

@zespri - यदि आप IDISposable को लागू करने का निर्णय ले रहे हैं, तो इसका तात्पर्य है कि आप कक्षा/वस्तु को बनाए रखते हैं (यानी यह तुम्हारा है)। यदि यह किसी तृतीय-पक्ष लाइब्रेरी से ऑब्जेक्ट है, तो आप IDISposable को लागू नहीं कर सकते हैं (यानी यह आपका नहीं है)। मैं इस बात का जिक्र नहीं कर रहा हूं कि क्या निपटान किया जाना चाहिए, न ही आप अप्रबंधित कोड में IDISposable लागू कर रहे हैं। – CodeNaked

+0

लेकिन यदि यह तृतीय-पक्ष (प्रबंधित) लाइब्रेरी से ऑब्जेक्ट है तो आप 'सेफहैंडल' को भी लागू नहीं कर सकते हैं?सिर्फ इसलिए कि आपको पहले स्थान पर हैंडल की कोई प्रत्यक्ष दृश्यता नहीं होने की संभावना है? क्षमा करें, यह समझने की कोशिश नहीं कर रहा है कि आप क्या समझ रहे हैं। –

5

आप किसी भी अप्रबंधित संसाधन के लिए सेफहैंडल का उपयोग/उपयोग करना चाहिए जिसे इंटिप्रेट, यानी Win32 हैंडल, अप्रबंधित कोड द्वारा आवंटित स्मृति आदि के रूप में प्रदर्शित किया जा सकता है। जब सेफहैंडल उपयुक्त नहीं है, लेकिन आपको अभी भी अप्रबंधित स्रोतों को संभालने की आवश्यकता है, CriticalFinalizerObject से अपना स्वयं का सेफहैंडल जैसी कक्षा बनाने में विचार करें।

अन्य सभी मामलों में (यानी प्रबंधित संसाधनों को संभालना) IDISposable लागू करें। ज्यादातर मामलों में आपको फाइनलाइज़र की आवश्यकता नहीं होगी, अधिकांश प्रबंधित संसाधन अनुपलब्ध होंगे जब अंतिमकर्ता कहा जाता है, इसलिए वहां कुछ भी नहीं होगा।

2

ज्यादातर मामलों में, मेरी सलाह यह बताती है कि फाइनेंजर जैसी कोई चीज़ नहीं है, लेकिन 100% निश्चित करें कि बनाई गई किसी भी आईडीस्पोज़ेबल ऑब्जेक्ट्स को नष्ट कर दिया जाए। यहां तक ​​कि यदि अंतिमकर्ता 100% बेहतर रूप से लिखे गए हैं, तो कोड जो आधे ऑब्जेक्ट्स को सही तरीके से डिस्पोजेक्ट करता है और अंतिम आधे को संभालने वाले फाइनल को कोड के रूप में उतना अच्छा नहीं होगा जितना कि उसकी सभी ऑब्जेक्ट्स का सही ढंग से निपटान करता है और फाइनलाइज़र का उपयोग नहीं करता है। हालांकि यह सच है कि अंतिम रूप से चलने वाले फाइनलरों से प्रदर्शन प्रभाव बहुत भयानक नहीं होता है, फाइनलरों को सही ढंग से लिखना मुश्किल होता है, अगर वे कोड या कोड जो उन्हें खाते हैं, वे पूरी तरह से लिखे गए हैं, तो वे हेइज़नबग्स का कारण बन सकते हैं। इसके अलावा, फाइनलाइजर्स के सफल कार्यान्वयन को अक्सर एक या अधिक वीकहैंडल्स के निर्माण की आवश्यकता होती है जिसका एकमात्र उद्देश्य अंतिमकरण का समर्थन करना है।

शायद अंतिमकरण की सुरक्षा-नेट लागत के लायक है, लेकिन लागत काफी हो सकती है और सुरक्षा-नेट जितना विश्वसनीय हो उतना विश्वसनीय नहीं हो सकता है।

संबंधित मुद्दे