2009-12-09 15 views
32

कृपया ध्यान दें: यह प्रश्न "विनाशक" और "अंतिमकरण" और उनके सही उपयोग के बीच शब्दावली में अंतर के बारे में है। मैंने सी # और सी ++/सीएलआई में उनके उपयोग के उदाहरण केवल उदाहरण दिए हैं कि मैं सवाल क्यों पूछ रहा हूं। मैं अच्छी तरह से जानता हूं कि इसे सी # और सीएलआर दोनों में कैसे कार्यान्वित किया जाता है, लेकिन मैं शब्दावली के सही उपयोग के बारे में पूछ रहा हूं।एक विनाशक और फाइनलाइज़र के बीच का अंतर?


सी # दुनिया में शब्द "नाशक" और "finalizer" जो मुझे लगता है क्योंकि सी # विनिर्देश गैर नियतात्मक सफाई कार्यक्षमता का वर्णन शब्द "नाशक" उपयोग कर रहा है काफी दूसरे के स्थान पर प्रयोग की जाने वाली, लग रहे हैं , जबकि सीएलआर दस्तावेज हमेशा "फाइनलाइज़र" शब्द का उपयोग करता है, इसलिए सी # के दायरे में उनका मतलब एक ही बात है।

हालांकि, सी ++/सीएलआई विनिर्देश में दोनों के बीच एक अंतर है। यह दोनों नियतात्मक और गैर नियतात्मक सफाई की अनुमति देता है, और नियतात्मक कार्यक्षमता के लिए शब्द "नाशक" और गैर नियतात्मक कार्यक्षमता के लिए "finalizer" का उपयोग करता है:

finalizer गैर नियतात्मक सफाई प्रदान करता है। एक फाइनेंजर एक "आखिरी मौका" समारोह है जिसे कचरा संग्रह के दौरान निष्पादित किया जाता है, आमतौर पर उस वस्तु पर जिसका विनाशक निष्पादित नहीं किया गया था।

इसके अतिरिक्त destructor और finalizer के विकिपीडिया विवरण संकेत मिलता है कि विनाशकर्ता और finalizers अलग अवधारणाओं रहे हैं, और नियतिवाद के संबंध में पदों की C++/CLI कल्पना के उपयोग का समर्थन करता है:

विनाशकर्ता के विपरीत, finalizers हैं निर्धारिक नहीं। जब कोई प्रोग्राम स्पष्ट रूप से किसी ऑब्जेक्ट को मुक्त करता है तो एक विनाशक चलाया जाता है। एक कटाई, इसके विपरीत, निष्पादित किया जाता है जब आंतरिक कचरा संग्रह प्रणाली वस्तु को मुक्त करती है।

सवाल:

  • वहाँ है, को देखने के एक कंप्यूटर विज्ञान की दृष्टि से, एक "नाशक" और एक "finalizer" के बीच एक स्पष्ट रूप से परिभाषित अंतर है, या शब्दावली कुछ है कि केवल कर सकते हैं प्रासंगिक रूप से परिभाषित किया जाना चाहिए?

  • यदि स्पष्ट रूप से परिभाषित अंतर है, तो सी # spec 'गलत' शब्दावली का उपयोग क्यों करेगा?

उत्तर

36

1) क्या उद्योग या अकादमिक में उपयोग किए जाने वाले "विनाशक" और "अंतिमकरण" के बीच एक अच्छी तरह से परिभाषित अंतर है?

निश्चित रूप से ऐसा प्रतीत होता है। अंतर यह प्रतीत होता है कि विनाशक क्लीनअप विधियां हैं जिन्हें निश्चित रूप से बुलाया जाता है, जबकि कचरा कलेक्टर उन्हें बताते समय फाइनल चलाता है।

2) उस स्थिति में, सी # spec इसे गलत हो जाता है - अंतिमकर्ता को सी # में "विनाशक" कहा जाता है। सी # spec के लेखकों को यह गलत क्यों मिला?

मुझे नहीं पता, लेकिन मुझे लगता है। वास्तव में, मेरे पास दो अनुमान हैं।

अनुमान # 1 यह है कि 12 मई 1 999 को विकिपीडिया लेख स्पष्ट रूप से इन दो अवधारणाओं के बीच सूक्ष्म अंतर का वर्णन नहीं करता था। ऐसा इसलिए है क्योंकि विकिपीडिया नहीं था। विकिपीडिया नहीं होने पर वापस याद रखें? अंधेरे उम्र, आदमी। त्रुटि शायद एक ईमानदार गलती हो सकती है, मानना ​​है कि दोनों शब्द समान थे।

ओह, सब मुझे पता है के लिए, दो शब्दों मई 12 वीं, 1999, और परिभाषाओं में अंतर पर समान केवल विकसित बाद में, के रूप में यह स्पष्ट हो गया उत्सुक और आलसी सफाई तरीकों को स्पष्ट करने के लिए एक आवश्यकता है थे ।

अनुमान # 2 मई 12 वीं, 1999 को, भाषा डिजाइन समिति संभावना है कि एक "नाशक" कुछ अन्य एक finalizer से के रूप में लागू किया जा सकता खोलने छोड़ने के लिए कामना की है। यही है, "विनाशक" को सी # भाषा अवधारणा के रूप में डिजाइन किया गया था जो आवश्यक रूप से .NET "फ़ाइनलाइज़र" अवधारणा के साथ एक-दूसरे को मैप नहीं करता था। एक ही समय में एक भाषा को डिजाइन करते समय फ्रेमवर्क के रूप में यह भी डिज़ाइन किया जा रहा है, कभी-कभी आप अपने उपप्रणाली में देर से ब्रेकिंग डिज़ाइन परिवर्तनों के खिलाफ स्वयं को अपनाना चाहते हैं।

मई 12 वीं 1999 के लिए भाषा समिति के नोट्स भाग में पढ़ें:

हम सदस्य जो कार्यान्वित जब एक उदाहरण पुन: दावा करने के लिए शब्द "नाशक" का उपयोग करने जा रहे हैं। कक्षाएं में विनाशक हो सकते हैं; structs नहीं कर सकते हैं। सी ++ के विपरीत, एक विनाशक स्पष्ट रूप से नहीं कहा जा सकता है। विनाश गैर-निर्धारक - आप विश्वसनीय नहीं कर सकते हैं जब विनाशक निष्पादित करेगा, यह कहने के अलावा कि बिंदु पर यह ऑब्जेक्ट के सभी संदर्भों के बाद निष्पादित हो गया है। विरासत श्रृंखला में विनाशकों को क्रमशः वंश से कम से कम वंशज तक क्रम में बुलाया जाता है। व्युत्पन्न कक्षा के लिए आधार विनाशक को स्पष्ट रूप से कॉल करने के लिए कोई आवश्यकता नहीं है (और कोई रास्ता नहीं)। सी # कंपाइलर उचित सीएलआर प्रतिनिधित्व के लिए विनाशकों को संकलित करता है। के लिए यह संस्करण संभवतः उदाहरण फ़ाइनलज़र का अर्थ है जो मेटाडेटा में विशिष्ट है। सीएलआर भविष्य में स्थिर अंतिमकर्ता प्रदान कर सकता है; हमें स्थैतिक फ़ाइनलाइजर्स का उपयोग करके सी # पर कोई बाधा दिखाई नहीं दे रही है।

तो, अब, अब आप इस विषय पर जो कुछ भी जानते हैं उसे जानते हैं। यदि आप और जानना चाहते हैं, अगली बार जब आप उसे देखते हैं तो एंडर्स से पूछें।

+2

दिलचस्प; नोट्स से यह निश्चित रूप से लगता है कि विनाशक ने निर्धारणा को इंगित नहीं किया था, इसलिए मुझे लगता है कि आप शायद सही हैं कि यह एक भेद है जो तब से विकसित हुआ है। –

4

मेरा मानना ​​है कि 'विनाशक' सी # कोड है, और 'फाइनलाइज़र' संकलित सीआईएल विधि है। सी # कंपाइलर एक विनाशक को अंतिम रूप में बदल देता है।

संपादित करें: अधिक verbose होने के लिए; सी # भाषा विनिर्देश एक वर्ग पर सी # इंस्टेंस विधि के रूप में 'विनाशक' को परिभाषित करता है। 'विनाशक', तो, सी # व्याकरण का हिस्सा है - विनाशक स्रोत भाषा में दिखाई देने वाली भाषाई वस्तु है।

एक विनाशक एक सदस्य है जो कक्षा के उदाहरण को नष्ट करने के लिए आवश्यक कार्यों को लागू करता है। विनाशकों के पास पैरामीटर नहीं हो सकते हैं, उनके पास एक्सेसिबिलिटी संशोधक नहीं हो सकते हैं, और उन्हें स्पष्ट रूप से शामिल नहीं किया जा सकता है। एक उदाहरण के लिए विनाशक कचरा संग्रह के दौरान स्वचालित रूप से लागू किया जाता है।

ए 'finalizer' GC.WaitForPendingFinalizers() के लिए कॉल में, साझा भाषा क्रम में इस्तेमाल किया उदाहरण के लिए एक शब्द है, और यह किसी भी .net भाषा ही नहीं, सी # को दर्शाता है। किसी भी .net संदर्भ प्रकार में एक फाइनलाइज़र हो सकता है। सी # कक्षा (स्रोत कोड आर्टिफैक्ट) के लिए, विनाशक सीआईएल विधि में संकलित होता है जो सीएलआर प्रकार का फाइनलाइज़र होता है।

या अधिक संक्षेप, नाशकfinalizerके रूप में स्रोत कोडमशीन कोड है करने के लिए है;)

+0

मुझे पता है कि वे एक ही चीज़ के लिए मानचित्र हैं। मैं शब्दावली के सही उपयोग के बारे में पूछ रहा था। –

+0

हाय, ग्रेग। मैं उनके बारे में बात नहीं कर रहा था एक ही बात पर मैपिंग; जहां मेरा मतलब था कि एक शब्द एक स्रोत कोड आर्टेफैक्ट को संदर्भित करता है, और दूसरा संकलित मशीन-कोड आर्टेफैक्ट को संदर्भित करता है। सी # भाषा के नमूने में विनाशकों का उल्लेख किया गया है और सी # व्याकरण का हिस्सा हैं; फाइनलाइजर्स नहीं हैं। हालांकि, कचरा संग्रह (जो भाषा अज्ञेयवादी है) अंतिम रूपकों को संदर्भित करता है; उदाहरण के लिए, जीसी.WaitForPendingFinalizers() जैसे कॉल में; इस प्रकार, फाइनलाइज़र एक सीएलआर शब्द है, और एक .net ऑब्जेक्ट की स्मृति जारी करने से पहले सफाई की प्रक्रिया को संदर्भित करता है। मैं वहां अपनी स्पष्टीकरण के लिए अपनी पोस्ट को संपादित करने का प्रयास करूंगा, –

+0

सी # में विनाशक नहीं हैं, केवल अंतिमकर्ता हैं। तथ्य यह है कि यह सी ++ के विनाशक के लिए एक समान वाक्यविन्यास साझा करता है इससे कोई फर्क नहीं पड़ता। – user7116

3

अगर हम विनाशकर्ता की "नियतात्मक" परिभाषा के लिए बाध्य नहीं होते, तो मैं कहूँगा कि .NET ऑब्जेक्ट्स में कोई विनाशक नहीं है जब तक कि the IDisposable interface का उपयोग करके स्पष्ट रूप से लागू नहीं किया जाता है।

7

कड़ाई से बोलने वाले सी # में विनाशक नहीं है (मुझे विश्वास है कि सी # spec इस बिंदु पर भ्रमित है)। सी # का फाइनलाइज़र एक सी ++ विनाशक जैसा दिखता है, लेकिन जैसा कि आप कहते हैं, गैर-निर्धारिती है। सी # IDisposable::Dispose के रूप में निर्धारक साफ-सफाई है (लेकिन इसे अभी भी विनाशक नहीं कहा जाता है)।

सी ++/सीएलआई में निर्धारक विनाशक हैं, जो सी ++ विनाशकों की तरह दिखते हैं। सीएलआई स्तर पर इन मानचित्रों पर IDisposable::Dispose() (IDisposable आपके लिए लागू किया गया है)। सी ++/सीएलआई में गैर-निर्धारक फ़ाइनलाइज़र हैं, जो विनाशकों की तरह दिखते हैं लेकिन इसका उपयोग करते हैं!^उपसर्ग के बजाय उपसर्ग।

तथ्य यह है कि सी ++/सीएलआई विनाशकों के लिए समान वाक्यविन्यास का उपयोग करता है जो अंतिम रूप से सी # उपयोग करता है, यह थोड़ा उलझन में हो सकता है - लेकिन यह सी ++ के साथ बेहतर फिट बैठता है, जिसमें निर्धारवादी विनाश की एक मजबूत परंपरा है।

दुर्भाग्यवश इन शर्तों की सार्वभौमिक परिभाषाओं की कमी का मतलब है कि आपको हमेशा यह स्पष्ट करने की आवश्यकता है कि आप किस बारे में बात कर रहे हैं। सी # अवधारणा और रिजर्व विनाशक संदर्भों के लिए जब मैं निश्चित रूप से निर्धारक विनाश का तात्पर्य करता हूं, तो व्यक्तिगत रूप से मैं फ़ाइनलाइज़र शब्द का उपयोग करता हूं।

[अपडेट] चूंकि मेरी मूल पोस्ट यहां एरिक लिपर्ट ने अपनी प्रतिक्रिया (स्वीकृत उत्तर) पोस्ट की है और उसी पर blog post के साथ पीछा किया है। मुझे यह देखकर खुशी हो रही है कि हम समझौते में हैं :-)

+1

'समस्या' यह है कि सी # इसे एक विनाशक कहते हैं। –

+1

हां, मुझे याद आया कि मैंने पहले जवाब देने के बाद - यह दोनों शर्तों का उपयोग करता है - इसलिए इसके बारे में मेरी अतिरिक्त टिप्पणी भ्रमित हो रही है। यह दोनों फाइनलाइज़र को कॉल करने के लिए स्पष्ट और अभी भी सही है। – philsquared

+0

+1 मुझे लगता है कि यह सबसे अच्छा जवाब है। ऐसा लगता है कि सी # spec इसकी शर्तों के साथ थोड़ा भ्रामक है। शायद यह एक इंटर्न द्वारा लिखा गया था: पी – SwDevMan81

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