मैं .NET में चार साल (ज्यादातर सी #) के लिए प्रोग्रामिंग कर रहा हूं और मैं बड़े पैमाने पर IDPosable का उपयोग करता हूं, लेकिन मुझे अभी तक फाइनलर की आवश्यकता नहीं है। के लिए फाइनलर्स क्या हैं?के लिए फाइनलर्स क्या हैं?
उत्तर
एक finalizer सुनिश्चित करने के लिए है कि कुछ सही ढंग से साफ किया जाता है एक अंतिम खाई प्रयास है, और आमतौर पर वस्तुओं है कि इस तरह अप्रबंधित हैंडल आदि कि कचरा एकत्र नहीं किया जाएगा के रूप में अप्रबंधित संसाधन, लपेट लिए आरक्षित है।
वास्तव में एक फाइनलाइज़र लिखना दुर्लभ है। सौभाग्य से (और IDisposable
के विपरीत), अंतिमकर्ताओं को प्रचारित करने की आवश्यकता नहीं है; इसलिए यदि आप एक finalizer के साथ एक ClassA
, और एक ClassB
जो ClassA
लपेटता है, तो ClassB
एक finalizer की जरूरत नहीं है - लेकिन काफी संभावना दोनों ClassA
और ClassB
IDisposable
लागू करेगा।
प्रबंधित कोड के लिए, IDisposable
आमतौर पर पर्याप्त है। भले ही आप सही तरीके से साफ नहीं करते हैं, अंत में प्रबंधित वस्तुओं को एकत्रित किया जाएगा (माना जाता है कि वे जारी किए गए हैं)।
अंतिमकर्ता संसाधनों की सफाई के लिए हैं यदि उनका निपटारा नहीं किया गया था।
आईई, कुछ भी लागू नहीं करता है जिसे आपने कभी भी निपटान() कहा है, लेकिन अंतिमकर्ता कचरा कलेक्टर द्वारा स्वचालित रूप से बुलाए जाते हैं।
इस कार्यक्षमता पर भरोसा नहीं किया जाना चाहिए, क्योंकि कोई गारंटी नहीं है जब (या यदि) कचरा संग्रह आपके ऑब्जेक्ट पर पहुंच जाएगा।
फाइनलर्स एक अप्रबंधित हैंडल की तरह कचरा कलेक्टर द्वारा नियंत्रित संसाधनों को जारी करने के लिए एक तंत्र के रूप में नहीं हैं। जबकि Dispose
ऐसा कर सकता है, यह गारंटी नहीं है कि उपभोक्ता इसे कॉल करेगा।
फ़ाइनलाइजर्स केवल अप्रबंधित संसाधनों के लिए जीडीआई बिटमैप हैंडल जैसे संसाधनों को मुक्त करने के लिए हैं। यदि आप किसी भी अप्रबंधित संसाधन आवंटित नहीं करते हैं तो आपको अंतिमकर्ताओं की आवश्यकता नहीं है। आम तौर पर फाइनल में किसी भी प्रबंधित ऑब्जेक्ट को स्पर्श करना एक बुरा विचार है क्योंकि अंतिमकरण का आदेश गारंटी नहीं है।
फाइनेंजर का उपयोग कर एक अन्य उपयोगी तकनीक यह कहना है कि आवेदन करने के लिए आवेदन करने की आवश्यकता होने पर निपटान किया गया है।
void Dispose()
{
GC.SuppressFinalize(this);
}
#if DEBUG
~MyClass()
{
Debug.Fail("Dispose was not called.");
}
#endif
विकिपीडिया 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;
व्यक्तिगत रूप से, मैं कॉपी-पेस्ट तो मैं रैप करने के लिए है कि पुन: उपयोग के लिए एक अमूर्त वर्ग में करते हैं बर्दाश्त नहीं कर सकता।
जब तक आपकी कक्षा सीधे * अप्रबंधित * संसाधनों से संबंधित न हो, तो आपको शायद फाइनलजर की आवश्यकता नहीं है। अंततः प्रबंधित संसाधनों को जीसी द्वारा निपटाया जाना चाहिए, इस पर ध्यान दिए बिना कि उपयोगकर्ता निपटान करता है या नहीं। – LukeH
यह मुझे "शायद" के बजाय "संभवतः" लिखने के लिए तैयार किया गया है और मैं इसके बारे में चिंतित हूं। लेकिन वैसे भी यह सच नहीं है। यदि आपकी कक्षा कुछ अन्य IDISposable लागू करती है तो उस पर आप निपटान() को कॉल करने की ज़िम्मेदारी भी है। और जैसा कि यह जाता है, एमएसडीएन से "इस इंटरफेस का प्राथमिक उपयोग अप्रबंधित संसाधनों को जारी करना है।" – annakata
- 1. प्रबंधित प्रकार क्या हैं? क्या वे डेल्फी के लिए विशिष्ट हैं? क्या वे विंडोज के लिए विशिष्ट हैं?
- 2. क्रॉस जॉइन के लिए क्या उपयोग हैं?
- 3. मैक के लिए Visio विकल्प क्या हैं?
- 4. AudioServicesPlaySystemSound के लिए सिस्टम ध्वनियां क्या हैं?
- 5. क्या jsPlumb के लिए कोई विकल्प हैं?
- 6. क्या सत्र चर के लिए सीमाएं हैं?
- 7. इनलाइन नेमस्पेस के लिए क्या हैं?
- 8. विचारों के लिए क्या अच्छे हैं?
- 9. स्थैतिक तरीकों के लिए डाउनसाइड्स क्या हैं?
- 10. मोशन जेपीईजी के लिए विनिर्देश क्या हैं?
- 11. के लिए DomDocument नामस्थान क्या हैं?
- 12. oaidl.idl और ocidl.idl के लिए क्या हैं?
- 13. के लिए हैंडल क्या हैं? IntPtr
- 14. PHP के लिए Agile उपकरण क्या हैं?
- 15. एक्सएमएल नेमस्पेस के लिए क्या हैं?
- 16. कोरआउट के लिए उपयोग-मामले क्या हैं?
- 17. क्या ओओपी के लिए कोई नियम हैं?
- 18. sysctl() के लिए तर्क क्या हैं?
- 19. पॉइंटर्स के लिए पॉइंटर्स क्या हैं?
- 20. क्या XmlUnit के लिए कोई विकल्प हैं?
- 21. रेडियो बटन के लिए विकल्प क्या हैं?
- 22. के लिए .git/info/grafts क्या हैं?
- 23. जावा प्रमाणीकरण के लिए विकल्प क्या हैं?
- 24. CreateParams.Style के लिए संभावित मूल्य क्या हैं?
- 25. सी के लिए आम पुस्तकालय क्या हैं?
- 26. शब्दकोश देखने के लिए वस्तुएं क्या हैं?
- 27. क्या स्कैला के लिए कोड obfuscation के लिए उपकरण हैं?
- 28. क्या संग्रहीत प्रक्रिया निष्पादन के लिए "क्या आप निश्चित हैं"? :)
- 29. पायथन के __new__ के लिए उपयोग के मामले क्या हैं?
- 30. क्या छवि के संकल्प को बढ़ाने के लिए एल्गोरिदम हैं?
बीटीडब्ल्यू, मैं अंग्रेजी हूं, और मुझे पता चला है कि यह एक * वास्तव में * * सचमुच * अच्छा विचार है कि वर्तनी की आदत में "अंतिमकरण" और "प्रारंभिक" एक जेड के साथ नहीं है। अन्यथा, जब आप दस्तावेज में उनके लिए खोज करते हैं तो आप कभी भी खूनी चीज़ों को नहीं ढूंढ सकते! –
@onebyone - ditto। इसी प्रकार, रंग ... यह मुझे जलन पैदा करता था, लेकिन अब मैं उन्हें उद्योग के लिए तकनीकी शब्द मानता हूं, और काम पूरा करता हूं ;- –
मैं खुद को प्रशिक्षित करने की कोशिश कर रहा हूं - मैं इसे दस्तावेज़ीकरण और सार्वजनिक रूप में उपयोग करता हूं कोड का सामना करना पड़ रहा है, लेकिन मैं खुद को "वास्तविक जीवन" में करने के लिए खुद को नहीं ला सकता हूं। –