2009-04-20 14 views
7

मैं .NET में चार साल (ज्यादातर सी #) के लिए प्रोग्रामिंग कर रहा हूं और मैं बड़े पैमाने पर IDPosable का उपयोग करता हूं, लेकिन मुझे अभी तक फाइनलर की आवश्यकता नहीं है। के लिए फाइनलर्स क्या हैं?के लिए फाइनलर्स क्या हैं?

+5

बीटीडब्ल्यू, मैं अंग्रेजी हूं, और मुझे पता चला है कि यह एक * वास्तव में * * सचमुच * अच्छा विचार है कि वर्तनी की आदत में "अंतिमकरण" और "प्रारंभिक" एक जेड के साथ नहीं है। अन्यथा, जब आप दस्तावेज में उनके लिए खोज करते हैं तो आप कभी भी खूनी चीज़ों को नहीं ढूंढ सकते! –

+1

@onebyone - ditto। इसी प्रकार, रंग ... यह मुझे जलन पैदा करता था, लेकिन अब मैं उन्हें उद्योग के लिए तकनीकी शब्द मानता हूं, और काम पूरा करता हूं ;- –

+0

मैं खुद को प्रशिक्षित करने की कोशिश कर रहा हूं - मैं इसे दस्तावेज़ीकरण और सार्वजनिक रूप में उपयोग करता हूं कोड का सामना करना पड़ रहा है, लेकिन मैं खुद को "वास्तविक जीवन" में करने के लिए खुद को नहीं ला सकता हूं। –

उत्तर

10

एक finalizer सुनिश्चित करने के लिए है कि कुछ सही ढंग से साफ किया जाता है एक अंतिम खाई प्रयास है, और आमतौर पर वस्तुओं है कि इस तरह अप्रबंधित हैंडल आदि कि कचरा एकत्र नहीं किया जाएगा के रूप में अप्रबंधित संसाधन, लपेट लिए आरक्षित है।

वास्तव में एक फाइनलाइज़र लिखना दुर्लभ है। सौभाग्य से (और IDisposable के विपरीत), अंतिमकर्ताओं को प्रचारित करने की आवश्यकता नहीं है; इसलिए यदि आप एक finalizer के साथ एक ClassA, और एक ClassB जो ClassA लपेटता है, तो ClassB एक finalizer की जरूरत नहीं है - लेकिन काफी संभावना दोनों ClassA और ClassBIDisposable लागू करेगा।

प्रबंधित कोड के लिए, IDisposable आमतौर पर पर्याप्त है। भले ही आप सही तरीके से साफ नहीं करते हैं, अंत में प्रबंधित वस्तुओं को एकत्रित किया जाएगा (माना जाता है कि वे जारी किए गए हैं)।

1

अंतिमकर्ता संसाधनों की सफाई के लिए हैं यदि उनका निपटारा नहीं किया गया था।

आईई, कुछ भी लागू नहीं करता है जिसे आपने कभी भी निपटान() कहा है, लेकिन अंतिमकर्ता कचरा कलेक्टर द्वारा स्वचालित रूप से बुलाए जाते हैं।

इस कार्यक्षमता पर भरोसा नहीं किया जाना चाहिए, क्योंकि कोई गारंटी नहीं है जब (या यदि) कचरा संग्रह आपके ऑब्जेक्ट पर पहुंच जाएगा।

2

फाइनलर्स एक अप्रबंधित हैंडल की तरह कचरा कलेक्टर द्वारा नियंत्रित संसाधनों को जारी करने के लिए एक तंत्र के रूप में नहीं हैं। जबकि Dispose ऐसा कर सकता है, यह गारंटी नहीं है कि उपभोक्ता इसे कॉल करेगा।

4

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

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

void Dispose() 
{ 
    GC.SuppressFinalize(this); 
} 
#if DEBUG 
~MyClass() 
{ 
    Debug.Fail("Dispose was not called."); 
} 
#endif 
1

विकिपीडिया says:: यह पकड़ एक डीबग बिल्ड में त्रुटियों कोडन में मदद कर सकते

... एक finalizer कोड का एक टुकड़ा है सुनिश्चित करता है कि कि कुछ आवश्यक कार्रवाई जब एक अधिग्रहीत लिया जाता है संसाधन ... अब नहीं किया जा रहा है [क्योंकि मालिक विषय रहा है कचरा एकत्र]

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

एमएस खुद को सुझाव है कि आप अपने इसको लागू करने में यह करने के लिए कुछ इसी तरह लिखें:

public void Dispose() 
    { 
     this.Dispose(true); 
    } 

    protected virtual void Dispose(bool disposing) 
    { 
     if (!this.isDisposed) 
     { 
      if (disposing) 
      { 
       GC.SuppressFinalize(this); 
      } 
     } 
     //Dispose of resources here 
     this.isDisposed = true; 
    } 

    ~DisposableSafe() 
    { 
     this.Dispose(false); 
    } 

    private bool isDisposed = false; 

व्यक्तिगत रूप से, मैं कॉपी-पेस्ट तो मैं रैप करने के लिए है कि पुन: उपयोग के लिए एक अमूर्त वर्ग में करते हैं बर्दाश्त नहीं कर सकता।

+0

जब तक आपकी कक्षा सीधे * अप्रबंधित * संसाधनों से संबंधित न हो, तो आपको शायद फाइनलजर की आवश्यकता नहीं है। अंततः प्रबंधित संसाधनों को जीसी द्वारा निपटाया जाना चाहिए, इस पर ध्यान दिए बिना कि उपयोगकर्ता निपटान करता है या नहीं। – LukeH

+0

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

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