2010-03-12 18 views
29

आईडीस्पोजेबल को कार्यान्वित करने के लिए सबसे अच्छा अभ्यास क्या है?मुझे IDISposable कब लागू करना चाहिए?

अगर आपके पास कक्षा में एक प्रबंधित ऑब्जेक्ट है, तो यह लागू करने के लिए अंगूठे का सबसे अच्छा नियम है, या यह निर्भर करता है कि ऑब्जेक्ट कक्षा में बनाया गया था या बस पास हो गया था? क्या मुझे कक्षाओं के लिए भी ऐसा कोई काम नहीं करना चाहिए?

+2

@ एरविकर: यदि आपने उस विषय पर मुझसे अधिक पाया है, तो मैं इसकी सराहना करता हूं कि आप इसे मेरे साथ साझा करें। – Bobby

+2

http://stackoverflow.com/search?q=IDisposable+owner –

उत्तर

26

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

(सहमत थे कि यह सवाल पहले से ही काफी बार कहा गया है के रूप में स्याही से बाहर एक छोटे से प्रिंटर वे मुद्रित किया जाना चाहिए चलाने के लिए ...)

6

आपको IDISposable लागू करना चाहिए जब आपकी कक्षा उन संसाधनों को रखती है जिन्हें आप रिलीज़ करना चाहते हैं जब आप उनका उपयोग समाप्त कर लेते हैं।

0

यदि इसमें संपत्तियां हैं जिन्हें निपटान करने की भी आवश्यकता है।

6

अपनी कक्षा अप्रबंधित वस्तुओं, संसाधन, खोला फ़ाइलों या डेटाबेस ऑब्जेक्ट हैं जब , आपको IDisposable को लागू करने की आवश्यकता है।

4

मुझे लगता है कि the docs इस बारे में स्पष्ट है कि IDISposable के लिए क्या अच्छा है।

अप्रबंधित संसाधनों को जारी करने के लिए इस इंटरफ़ेस का प्राथमिक उपयोग है। कचरा कलेक्टर स्वचालित रूप से प्रबंधित ऑब्जेक्ट को आवंटित स्मृति को रिलीज़ करता है जब उस ऑब्जेक्ट का अधिक उपयोग नहीं किया जाता है। हालांकि, यह अनुमान लगाने के लिए संभव नहीं है कि कब कचरा संग्रह होगा। इसके अलावा, कचरा कलेक्टर के पास अप्रबंधित संसाधनों जैसे कि विंडो हैंडल, या खुली फ़ाइलें और स्ट्रीम का कोई ज्ञान नहीं है।

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

10

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

उदाहरण के तौर पर, मेरे पास एक ऐसी सेवा है जो बच्चे के दृश्य में इंजेक्शन दी जाती है, कि बच्चा दृश्य सेवा पर विभिन्न एसिंक समाप्त प्रकार की घटनाओं की सदस्यता लेगा। उस बच्चे के दृश्य के मालिक को पता नहीं है कि ठोस प्रकार क्या है, यह बस इसे एक इंटरफेस के रूप में है। सेवा भविष्य में कुछ मनमानी बिंदु पर गुंजाइश से बाहर हो सकती है, और मैं नहीं चाहता कि यह जीसीएड न होने के आसपास लटक रहा हो। उस बच्चे के दृश्य से छुटकारा पाने के बाद, मालिक किसी भी ईवेंट हैंडलर को खोलने का मौका देने के लिए उस पर निपटान करेगा। यहां थोड़ा सा संकुचित (और बहुत छद्म कोड) उदाहरण है, ध्यान दें कि बच्चे के दृश्य के लिए इंटरफेस भी IDisposable लागू करता है।

public class OwnerView { 

    public OwnerView() { 
     _childView = new ChildView(myServiceReference); 
    } 

    public void CloseChildView() { 
     if (childView != null) { 
      _childView.Close(); 
      _childView.Dispose(); 
     } 

     _childView = null; 
    } 

    private IChildView _childView; 
} 

public class ChildView : IChildView { 

    public ChildView(MyService serviceRef) { 
     _serviceRef = serviceRef; 
     _serviceRef.GetSettingsAsyncFinished += new EventHandler(someEventHandler); 
    } 

    public void IDisposable.Dispose() { 
     _serviceRef -= someEventHandler; 
    } 

    private MyService _serviceRef; 
} 

public interface IChildView : IDisposable { 
    void DoSomething(); 
    ... etc ... 
} 

वहाँ, इतने पर दूसरों से कहीं अधिक आधिकारिक टिप्पणी नहीं इस बारे में कर रहे हैं Do event handlers stop garbage collection from occuring? और Garbage collection when using anonymous delegates for event handling की तरह। आप यह codeproject आलेख भी देखना चाहेंगे।

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