2011-01-20 12 views
5

मैं एक उदाहरण के माध्यम से काम कर रहा था और मैं इस देखा ...एक विधि कॉल के सामने एक टिल्ड डालने?

#if DEBUG 
    /// <summary> 
    /// Useful for ensuring that ViewModel objects are properly garbage collected. 
    /// </summary> 
    ~ViewModelBase() 
    { 
     string msg = string.Format("{0} ({1}) ({2}) Finalized", this.GetType().Name, this.DisplayName, this.GetHashCode()); 
     System.Diagnostics.Debug.WriteLine(msg); 
    } 
#endif 

मैं यह गूगल की कोशिश की लेकिन कोई भी परिणाम नहीं मिल सका ... मैं बस सोच रहा था कि इसका क्या मतलब। किसी को पता है?

धन्यवाद

+0

संभावित डुप्लिकेट [सी # में टिल्ड (~) का मतलब क्या है?] (Http://stackoverflow.com/questions/188688/what-does-the-tilde-mean-in-c) –

+1

आपको स्वीकार करना चाहिए आपके सवालों के जवाब। – SLaks

उत्तर

5

यह ViewModelBase क्लास के लिए अंतिमकर्ता है। संग्रह से पहले कचरा कलेक्टर द्वारा इसे बुलाया जाता है।

क) कचरा संग्रहण वास्तव में काम करता है और आप इसे परीक्षण करने के लिए की जरूरत नहीं है:

यह वास्तव में बहुत उपयोगी है क्योंकि नहीं है।

ख) यह आप अपने कोड के बारे में कुछ भी नहीं पता चलता है कि यह सामान्य निष्पादन के दौरान कहा जाता हो जाता है, क्योंकि अधिकांश भाग के लिए कचरा कलेक्टर सिर्फ अपने काम करता है और एकत्र करता है जब यह निर्धारित करता है स्मृति दबाव नहीं है।

अधिकांश भाग के लिए कचरा कलेक्टर के बारे में चिंता न करना ठीक है - केवल वास्तविक समस्या होने पर ही इसके बारे में चिंता करें।

यह भी अनुभव मुझे बताता है - फ़ाइनलाइज़र का उपयोग करने से बचें क्योंकि आप कभी भी सुनिश्चित नहीं हैं कि आपका शेष कार्यक्रम कब कहलाता है।

0

ओह ओह, मैं इसे दो सेकंड की तरह पाया के बाद मैं पोस्ट इस ... यह एक विनाश-या है। http://www.csharp-station.com/Tutorials/Lesson07.aspx

+0

http: // stackoverflow।com/प्रश्न/188688/what-does-the-tilde-mean-in-c/188715 # 188715 – hunter

7

इसे finalizer कहा जाता है।

जीसी धागे पर ऑब्जेक्ट एकत्र होने पर कचरा कलेक्टर द्वारा अनिश्चित बिंदु पर इसे बुलाया जाता है।

उनके पास प्रदर्शन प्रदर्शन भी है।

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

2

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

इस वर्ग के लेखक ने लिखा है कि डीबग कोड 100% स्पष्ट नहीं है, लेकिन ऐसे डिबगिंग कोड आमतौर पर "हे डमी" कहने का माध्यम है, आप मैन्युअल रूप से Dispose() पर कॉल करना भूल गए हैं "। यह काफी आम डीबगिंग सहायता है (मैंने इसे बहुत सारे कोड में देखा है), हालांकि मैं इसे स्वयं उपयोग नहीं करता हूं।

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

+0

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

+0

मुझे लगता है कि आप सही हैं। यदि प्रकार IDISposable नहीं है और एक बहुमूल्य संसाधन नहीं रखता है, तो यह काफी व्यर्थ डीबग कोड की तरह लगता है। जब भी मैंने #IF DEBUG फ़ाइनललाइज़र जोड़ते हुए देखा है, तो यह सुनिश्चित करना है कि फाइनलर कभी नहीं चलता है (इसे पर्फ हिट से बचने के लिए मैन्युअल रूप से निपटने पर दबाया जाना चाहिए)। मुझे पता है कि आप इस सामान को जानते हैं, बस रुचि रखने वाले लोगों के लिए इसे वर्तनी :) –

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