केवल बार जब आप एक finalizer लिखना चाहिए जब आप एक प्रकार अप्रबंधित संसाधन की एक नई तरह संभाल करने का निर्माण कर रहे है। उदाहरण के लिए, किसी डेटा ऐप लेयर जो किसी व्यावसायिक ऐप में एसक्यूएल सर्वर का उपयोग करता है उसे किसी भी फाइनलाइज़र की आवश्यकता नहीं होती है, भले ही अप्रबंधित डेटाबेस कनेक्शन शामिल हों, क्योंकि बुनियादी SqlConnection क्लास आवश्यकतानुसार उन कनेक्शन को अंतिम रूप देगी। लेकिन यदि आप स्क्रैच से एक नया नया डेटाबेस इंजन बना रहे हैं जिसमें एसक्यूएल सर्वर के समान कनेक्शन सीमाएं हैं और इसके लिए ado.net प्रदाता को कार्यान्वित कर रहे हैं, तो उस कनेक्शन प्रकार को अंतिम रूप से लागू करने के लिए एक अंतिमकर्ता को लागू करना चाहिए ताकि आपके कनेक्शन जारी रहे।
लेकिन प्रक्रिया समाप्त होने पर क्या होता है इससे परे आपको कोई गारंटी नहीं मिलती है।
अद्यतन:
इस संदर्भ को देखते हुए:
मैं एक कोड की समीक्षा मैं उसका कोड का किया था पर एक सहयोगी के साथ एक चर्चा कर रहा हूँ। उन्होंने जोर देकर कहा कि विनाशक वस्तु पर बुलाया जाने वाला है। मैं असहमत हूं (लेकिन मुझे यकीन नहीं है) और IDISposable का उपयोग पसंद करेंगे।
आप विनाशक/अंतिमकरण के उपयोग की आलोचना करने का अधिकार हैं। जैसा कि मैंने उपर्युक्त कहा है, आपको केवल उन्हीं संसाधनों के साथ काम करते समय उनका उपयोग करना चाहिए जो वास्तव में नए हैं। संसाधन का केवल इतना उदाहरण नहीं, बल्कि आप किस प्रकार के संसाधन के साथ काम कर रहे हैं।
कोड के लिए जो "सामान्य" अप्रबंधित संसाधन (SqlConnection, TcpClient, आदि जैसी चीजें) को पहचानता है, IDISposable एक बेहतर विकल्प है। फिर आप जानते हैं कि जैसे ही निपटान() को इकट्ठा करने के लिए इंतजार करने की आवश्यकता के बजाय संसाधन को साफ किया जाएगा।यदि कोई भी निपटान() (जो आपके सहयोगी की चिंता की संभावना है) को कॉल करता है, तब तक जब तक आपका नया प्रकार एकत्र नहीं किया जा सकता है, तब तक अप्रबंधित संसाधन के लिए मूल प्रकार का उदाहरण आप लपेट रहे हैं, साथ ही इसे अंतिम रूप में भी एकत्र किया जा सकता है, और यह फ़ाइनलाइज़र है संसाधन जारी करेगा।
तालिका में लाने के लिए आपको मुख्य चीज़ यह है कि अंतिम ऑब्जेक्ट एकत्र होने तक कॉल नहीं किया जा सकता है। आपको कचरा कलेक्टर पर इंतजार करना होगा, जिसका अर्थ है कि आप संसाधन को और भी लंबे समय तक खोल सकते हैं। IDisposable आपको इसे तुरंत जारी करने की अनुमति देता है। बेशक आप दोनों ही कर सकते हैं, लेकिन ऐसा लगता है कि यहां क्या हो रहा है, और यदि आपके पास दोनों को सावधान रहना है कि मूल प्रकार के फ़ाइनिज़र के साथ संघर्ष न करें या आप अवांछित और हानिकारक अपवाद पैदा कर सकें। और वास्तव में, आपका अपना फाइनलाइज़र कार्यान्वयन यहां केवल अनावश्यक है और अनावश्यक जटिलता को जोड़ता है।
अगर अभी स्मृति यह कचरा एकत्र नहीं किया जाएगा एक वस्तु को
संदर्भ नहीं हो सकता है और करने के लिए एक संदर्भ है:
अंत में, मैं इस कथन से इस मुद्दे को ले जाना है यह अभी भी एकत्रित किया जाएगा। क्या मायने रखता है यदि ऑब्जेक्ट पहुंच योग्य है: ऑब्जेक्ट रूट के संदर्भ में से कोई भी संदर्भ है। उदाहरण के लिए, आपके पास कई ऑब्जेक्ट्स वाली एक सूची हो सकती है। सूची दायरे से बाहर हो जाती है। स्पष्ट रूप से सूची में सभी वस्तुओं का संदर्भ अभी भी है, लेकिन वे अभी भी जीसी के पहले पास में एकत्र किए जा सकते हैं क्योंकि संदर्भ अब रूट नहीं है।
मुझे लगता है कि आपको इसके बारे में चिंता करने की ज़रूरत है, क्योंकि यदि आप अपने अंतिमकर्ता में कुछ महत्वपूर्ण काम करने की कोशिश करते हैं और इसे पूरा करने की अनुमति नहीं दी जा सकती है। –
सामान्य रूप से, आप अपने अंतिमकर्ता में पर्याप्त मात्रा में काम नहीं करेंगे। – SLaks
स्पष्ट रूप से; लेकिन यह मानना तार्किक लगता है कि यही कारण है कि वह पूछ रहा है; जवाब यह है कि 'आईडीस्पोजेबल' का उपयोग करना आपकी कक्षा के निर्धारक सफाई को सुनिश्चित करने का सबसे अच्छा तरीका है। –