C # में फ़ंक्शन नाम से पहले टिल्ड का क्या अर्थ है?


164

मैं कुछ कोड देख रहा हूँ और उसका यह कथन है:

~ConnectionManager()
{
    Dispose(false);
}

वर्ग IDisposableइंटरफ़ेस को लागू करता है, लेकिन मुझे नहीं पता कि यह उस भाग का हिस्सा है जिसके लिए tilde (~) का उपयोग किया जाता है।

जवाबों:


213

~ नाशवान है

  1. विध्वंसक स्वचालित रूप से लागू होते हैं, और स्पष्ट रूप से लागू नहीं किए जा सकते।
  2. विध्वंसक अतिभारित नहीं किए जा सकते। इस प्रकार, एक वर्ग, सबसे अधिक, एक विध्वंसक हो सकता है।
  3. विध्वंसक विरासत में नहीं मिले हैं। इस प्रकार, एक वर्ग के पास एक के अलावा कोई भी विध्वंसक नहीं है, जिसे इसमें घोषित किया जा सकता है।
  4. विध्वंसकों का उपयोग संरचनाओं के साथ नहीं किया जा सकता है। उनका उपयोग केवल कक्षाओं के साथ किया जाता है। एक उदाहरण विनाश के लिए पात्र हो जाता है जब किसी भी कोड के लिए आवृत्ति का उपयोग करना संभव नहीं होता है।
  5. उदाहरण के लिए विनाशकारी का निष्पादन किसी भी समय हो सकता है उदाहरण के बाद विनाश के लिए पात्र हो जाता है।
  6. जब एक उदाहरण को नष्ट कर दिया जाता है, तो इसकी विरासत श्रृंखला में विनाशकों को क्रम में, सबसे व्युत्पन्न से कम से कम व्युत्पन्न कहा जाता है।

अंतिम रूप

C # में, अंतिम विधि उन ऑपरेशनों को करती है जो एक मानक C ++ विध्वंसक करता है। C # में, आप इसे अंतिम रूप नहीं देते हैं - आप वर्ग के नाम से पहले एक टिल्ड (~) प्रतीक रखने के C ++ डिस्ट्रक्टर सिंटैक्स का उपयोग करते हैं।

निपटान

कक्षा के उपयोगकर्ता द्वारा स्पष्ट रूप से कहा जा सकता है कि एक Close()या Dispose()विधि में वस्तुओं के निपटान के लिए बेहतर है । जीसी द्वारा अंतिम रूप (विध्वंसक) कहा जाता है।

IDisposable इंटरफ़ेस दुनिया बताता है कि अपने वर्ग संसाधनों निपटारा करने के लिए की जरूरत है उस पर रखती है और उपयोगकर्ता उन्हें रिहा करने के लिए एक तरह से प्रदान करता है। यदि आपको अपनी कक्षा में एक अंतिम रूप से लागू करने की आवश्यकता है, तो आपके निपटान विधि को यह सुनिश्चित करने के लिए विधि का उपयोग करना चाहिएGC.SuppressFinalize() कि आपके उदाहरण को अंतिम रूप दिया जाए।

क्या उपयोग करें?

एक विध्वंसक को स्पष्ट रूप से कॉल करना कानूनी नहीं है। आपका विध्वंसक कचरा कलेक्टर द्वारा बुलाया जाएगा। यदि आप अनमोल संसाधनों को संभालते हैं (जैसे कि फ़ाइल हैंडल) जिसे आप बंद करना चाहते हैं और जितनी जल्दी हो सके निपटाना चाहते हैं, तो आपको आईडीसोफाइल इंटरफ़ेस लागू करना चाहिए।


3
मुझे नहीं पता कि यह अतीत में कैसे हुआ करता था। लेकिन अब विध्वंसक विरासत में मिले हैं। अधिक जानकारी के लिए इस लिंक को जांचें (उदाहरण को अंत में देखें): msdn.microsoft.com/en-us/library/66x5fx1b.aspx
RononDex

1
@RononDex बिंदु 3 आप जिस पेज पर राज्यों से लिंक करते हैं, " फाइनल नहीं हो सकता है" , जो आपकी टिप्पणी का खंडन करता है। यह वास्तव में थोड़ा भ्रमित करने वाला है क्योंकि जब उन्हें विरासत में नहीं दिया जा सकता है, तो " Finalizeविधि विरासत श्रृंखला में सभी उदाहरणों के लिए पुनरावर्ती कहलाती है, सबसे अधिक व्युत्पन्न से कम से कम व्युत्पन्न" । ध्यान दें कि यह वही व्यवहार नहीं है जो आप अंतर्निहित विध्वंसक से प्राप्त करेंगे, हालांकि।
मार्क अमेरी

@MarkAmery आह, मैं देख रहा हूं, इसलिए मूल रूप से उन्हें विरासत में मिला हुआ सामान मिलता है, जो कि विरासत में मिला है?
रोनेनडेक्स

45

यह एक फाइनल है । ईमानदार होने के लिए, आपको अंतिम रूप से लिखने की आवश्यकता बहुत कम होनी चाहिए। आप वास्तव में केवल एक लिखने की जरूरत है अगर:

  • आपके पास एक अप्रबंधित संसाधन (जैसे कि ए IntPtr) के माध्यम से सीधी पहुंच है और आप इसका उपयोग नहीं कर सकते हैं SafeHandleजो इसे आसान बनाता है
  • आप IDisposableएक ऐसे वर्ग में लागू कर रहे हैं जो सील नहीं है। (मेरी प्राथमिकता वर्गों को तब तक सील करना है जब तक वे विरासत के लिए डिज़ाइन नहीं किए जाते हैं।) एक अंतिम उपकरण ऐसे मामलों में विहित डिस्पोज़ल पैटर्न का हिस्सा है।

9

इसका उपयोग वर्ग के लिए विनाशकारी को इंगित करने के लिए किया जाता है।


12
वे दोनों सही हैं, जिसके आधार पर आप पढ़े जाने वाले C # कल्पना पर निर्भर करते हैं। सबसे हालिया एमएस एक (यूनिफाइड सी # 3.0) उन्हें डिस्ट्रक्टर्स (उदाहरण के लिए 10.13) के रूप में संदर्भित करता है, लेकिन ईसीएमए युक्ति उन्हें अंतिम रूप में संदर्भित करता है।
जॉन स्कीट

@ 1800INFORM: वाक्य-रचना तत्व को विध्वंसक कहा जाता है। यदि एक वर्ग में एक विध्वंसक होता है, तो एक सी # संकलक एक अंतिम रूप से ऑटो-जनरेट करेगा जिसमें एक आम तौर पर बेकार try/finallyब्लॉक शामिल होता है जो सुनिश्चित करता है कि मूल Finalizeविधि कहा जाता है। अधिकांश चीजें जो विध्वंसक की सच्ची होती हैं, वे अंतिम रूप से सत्य होती हैं, और इसके विपरीत, लेकिन शब्दों का अर्थ थोड़ा अलग होता है।
सुपरकैट

4

C ++ के समान, यह विनाशकारी है; हालाँकि C # में आपने इसे स्पष्ट रूप से नहीं कहा है, यह तब एकत्रित किया जाता है जब ऑब्जेक्ट एकत्र हो जाता है।


3

विध्वंसक देखें (C # प्रोग्रामिंग गाइड) । ध्यान रखें, हालांकि, C ++ के विपरीत, प्रोग्रामर का कोई नियंत्रण नहीं है जब विध्वंसक को बुलाया जाता है क्योंकि यह कचरा कलेक्टर द्वारा निर्धारित किया जाता है।


1

~ आमतौर पर एक डिकंस्ट्रक्टर का प्रतिनिधित्व करता है। जो किसी वस्तु के मरने से ठीक पहले चलाया जाता है।

यहाँ C # डिकंस्ट्रक्टर्स का विवरण दिया गया है


4
सही शब्द विध्वंसक / फाइनल होना चाहिए, न कि डिकंस्ट्रक्टर। Deconstructor का अर्थ है एक कंस्ट्रक्टर को डिकंस्ट्रक्ट करने के लिए एक सिंटैक्स।
एरियन कुसुमावर्धनो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.