उदाहरण के लिए:
public class Person
{
public Person()
{
}
~Person()
{
}
}
मुझे मैन्युअल रूप से विध्वंसक कब बनाना चाहिए? आपको विध्वंसक बनाने की आवश्यकता कब है?
उदाहरण के लिए:
public class Person
{
public Person()
{
}
~Person()
{
}
}
मुझे मैन्युअल रूप से विध्वंसक कब बनाना चाहिए? आपको विध्वंसक बनाने की आवश्यकता कब है?
जवाबों:
UPDATE: यह प्रश्न मेरे ब्लॉग का विषय था 2015 के मई में । महान प्रश्न के लिए धन्यवाद! ब्लॉग को उन झूठों की लंबी सूची के लिए देखें जिन्हें लोग आमतौर पर अंतिम रूप देने के बारे में मानते हैं।
मुझे मैन्युअल रूप से विध्वंसक कब बनाना चाहिए?
लगभग नहीं।
आमतौर पर एक केवल एक विध्वंसक बनाता है जब आपकी कक्षा कुछ महंगे अप्रबंधित संसाधन पर रोक रही होती है जिसे ऑब्जेक्ट के दूर होने पर साफ किया जाना चाहिए। यह सुनिश्चित करने के लिए डिस्पोजेबल पैटर्न का उपयोग करना बेहतर है कि संसाधन को साफ किया जाए। एक विध्वंसक तब अनिवार्य रूप से एक आश्वासन है कि यदि आपकी वस्तु का उपभोक्ता इसे निपटाना भूल जाता है, तो संसाधन अभी भी अंततः साफ हो जाता है। (शायद।)
यदि आप एक विध्वंसक बनाते हैं तो बेहद सावधान रहें और समझें कि कचरा संग्रहकर्ता कैसे काम करता है । विध्वंसक वास्तव में अजीब हैं :
लगभग कुछ भी नहीं है कि आम तौर पर सच है एक विध्वंसक में सच है। वास्तव में, वास्तव में सावधान रहें। एक सही विध्वंसक लिखना बहुत मुश्किल है।
आपको विध्वंसक बनाने की आवश्यकता कब है?
संकलक के भाग का परीक्षण करते समय जो विनाशकों को संभालता है। मुझे उत्पादन कोड में ऐसा करने की आवश्यकता नहीं है। मैं शायद ही कभी उन वस्तुओं को लिखता हूं जो मानव रहित संसाधनों में हेरफेर करते हैं।
इसे एक "फाइनल" कहा जाता है, और आपको आमतौर पर केवल एक वर्ग के लिए बनाना चाहिए, जिसका राज्य (यानी: फ़ील्ड) में अप्रबंधित संसाधन (यानी: पी / चालान कॉल के माध्यम से पुनर्प्राप्त किए जाने वाले हैंडल को शामिल करना) शामिल हैं। हालाँकि, .NET 2.0 और बाद में, वास्तव में अप्रबंधित संसाधनों की सफाई से निपटने का एक बेहतर तरीका है: SafeHandle । इसे देखते हुए, आपको अंतिम रूप से फिर से लिखने की ज़रूरत नहीं है।
जब तक आपकी कक्षा विंडोज फ़ाइल हैंडल जैसे अप्रबंधित संसाधनों को बनाए रखती है, तब तक आपको इसकी आवश्यकता नहीं है।
इसे डिस्ट्रक्टर / फ़ाइनलीज़र कहा जाता है, और आमतौर पर डिस्पोज़्ड पैटर्न को लागू करते समय बनाया जाता है।
यह एक गिरावट का समाधान है जब आपकी कक्षा का उपयोगकर्ता निपटान को कॉल करना भूल जाता है, यह सुनिश्चित करने के लिए कि (अंततः) आपके संसाधन जारी हो जाते हैं, लेकिन आपके पास कोई गारंटी नहीं है कि जब विध्वंसक को बुलाया जाता है।
इस स्टैक ओवरफ्लो प्रश्न में , स्वीकृत उत्तर सही ढंग से दिखाता है कि डिस्पोज़ पैटर्न को कैसे लागू किया जाए। यह केवल तभी आवश्यक है जब आपके वर्ग में कोई ऐसा अनचाहा संसाधन हो जिसे कचरा उठाने वाला स्वयं साफ करने का प्रबंध नहीं करता है।
एक अच्छा अभ्यास वर्ग के उपयोगकर्ता को मैन्युअल रूप से संसाधनों को मुक्त करने के लिए वस्तु का निपटान करने की संभावना के बिना एक अंतिम रूप से लागू नहीं करना है।
जब आपके पास अप्रबंधित संसाधन हैं और आपको यह सुनिश्चित करने की आवश्यकता है कि आपकी वस्तु के चले जाने पर उन्हें साफ किया जाएगा। अच्छा उदाहरण COM ऑब्जेक्ट या फ़ाइल हैंडलर होगा।
मैंने एक विध्वंसक (केवल डिबग उद्देश्यों के लिए) यह देखने के लिए उपयोग किया है कि क्या किसी ऑब्जेक्ट को WPF एप्लिकेशन के दायरे में मेमोरी से शुद्ध किया जा रहा है। अगर कचरा संग्रह सही मायने में स्मृति से वस्तु को शुद्ध कर रहा था, तो मैं अनिश्चित था, और यह सत्यापित करने का एक अच्छा तरीका था।
विध्वंसक आपकी कक्षा में कूटबद्ध किए गए अप्रबंधित संसाधनों को मुक्त करने का एक निहित तरीका प्रदान करते हैं, वे कहते हैं कि जब जीसी इसके चारों ओर हो जाता है और वे बेस क्लास के अंतिम विधि को निहित करते हैं। यदि आप बहुत से अप्रबंधित संसाधनों का उपयोग कर रहे हैं, तो उन संसाधनों को आईडीआईसोफ़ायर इंटरफ़ेस के माध्यम से मुक्त करने का एक स्पष्ट तरीका प्रदान करना बेहतर है। C # प्रोग्रामिंग गाइड देखें: http://msdn.microsoft.com/en-us/library/66x5fx1b.aspx