2010-07-31 3 views
8

मैं वास्तव में कुछ बेहतरीन अभ्यास ज्ञान की तलाश में हूं। तो यहां प्रश्न हैं, अगर लोग टिप्पणियां छोड़ देते हैं तो मैं और जोड़ दूंगा। इनमें से कुछ या सभी सवालों के जवाब देने के लिए स्वतंत्र महसूस करें।मुझे IDISposable का उपयोग कब करना चाहिए, क्या इसका उपयोग करना कभी गलत है? चेनिंग का निपटान करने के बारे में क्या?

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

निपटान पैटर्न की क्या भिन्नताएं हैं और वे क्यों भिन्न होते हैं?

आम अप्रबंधित संसाधन क्या हैं जिनके बारे में मुझे अवगत होना चाहिए?

क्या यह गलत है या IDISposable लागू करने के लिए भ्रामक है?

कॉल का निपटान कभी भी एक साथ बंधे होना चाहिए, या क्या हमें बयानों का उपयोग करने पर भरोसा करना चाहिए? उदाहरण के लिए:

public Dispose(bool disposing) 
{ 
    ... 
    this.SomeDependency.Dispose; 
} 

उत्तर

6

वाह। यहां बहुत सारे प्रश्न हैं!

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

IDisposableआमतौर पर संसाधनों को साफ करने के लिए प्रयोग किया जाता है, लेकिन जरूरी है कि सभी को इसके लिए अच्छा है नहीं है। यह एक सामान्य पैटर्न है जिसे आप उपभोग करने वाले वस्तु को सूचित करने के लिए करते हैं।

using(var timer = new MyTimer()) 
{ 
    //do some stuff 
} 

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

अंगूठे का एक और अच्छा नियम यह है कि यदि आपको किसी भी कारण से अंतिम रूप देने की आवश्यकता है, तो आपको आमतौर पर IDisposable उसी दिनचर्या तक पहुंच प्रदान करनी चाहिए ताकि उपभोक्ता वर्ग जीसी पर इंतजार करने के बजाए कक्षा को अंतिम रूप देने का विकल्प चुन सके। ।

निपटान पैटर्न की क्या भिन्नताएं हैं और वे क्यों भिन्न होते हैं?

सिर्फ एक ही असली "विशिष्ट" IDisposable कार्यान्वयन के प्रकार मैं के बारे में पता कर रहा हूँ है - अंतिम रूप/निपटान पैटर्न:

public class MyClass : IDisposable 
{ 
    void IDisposable.Dispose() 
    { 
    Dispose(true); 
    GC.SuppressFinalize(this); 
    } 

    protected virtual void Dispose(bool disposing) 
    { 
     if (disposing) 
     { 
     // Free other state (managed objects). 
     } 
     // Free your own state (unmanaged objects). 
     // Set large fields to null. 
    } 

    ~MyClass() 
    { 
     Dispose(false); 
    } 
} 

क्या आम अप्रबंधित संसाधनों मैं के बारे में पता होना चाहिए रहे हैं?

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

क्या यह गलत है या आईडीआईएसओपेबल लागू करने के लिए भ्रामक है?

यह अत्यधिक उपयोग करने के लिए व्यर्थ हो सकता है, लेकिन सीधे हानिकारक नहीं है।

फेंक चाहिए कॉल कभी एक साथ

एक वर्ग श्रृंखलित जा केवल किसी भी IDisposables कि वह आंतरिक रूप से बनाता है निपटाने चाहिए। यदि इसमें डिस्पोजेबल निर्भरताएं हैं जिन्हें कक्षा के दायरे से बाहर इंजेक्शन या लाइव किया गया था, तो आपको उन्हें कभी निपटाना नहीं चाहिए।

+1

महान उत्तर! अच्छा श्रीमान सोचा! – Firoso

3

वहाँ दो प्राथमिक बातें मैं IDisposable बारे में लिखा है कर रहे हैं, और मैं सुझाव है कि आप पढ़ा है कम से कम पहले एक: How to Implement IDisposable and Finalizers - 3 Easy Rules (मैं भी other blog posts on the subject है) और IDisposable - What Your Mother Never Told You about Resource Deallocation

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

IDisposable तीन चीजों में से एक के लिए उपयोग किया जाना चाहिए: एक अप्रबंधित संसाधन मुक्त करना, प्रबंधित संसाधनों को मुक्त करना, और आरएआईआई। मैं इन अलग-अलग ज़रूरतों के लिए विभिन्न पैटर्न का उपयोग करना पसंद करता हूं।

ध्यान दें कि मेरे शेष उत्तरों (और लिंक) सभी मुक्त संसाधनों के संदर्भ में IDisposable पर चर्चा कर रहे हैं। वे आरएआईआई को संबोधित नहीं करते हैं।

निपटान पैटर्न की क्या भिन्नताएं हैं और वे क्यों भिन्न होते हैं?

माइक्रोसॉफ्ट पैटर्न सबसे प्रसिद्ध है। यह अप्रबंधित और प्रबंधित संसाधनों को मुक्त करने और विरासत की इजाजत देता है। मैं अपने ब्लॉग (3 easy rules) पर वर्णित एक सरल पैटर्न पसंद करता हूं, जो कि माइक्रोसॉफ्ट वास्तव में .NET 2.0 के बाद से पैटर्न है।

आम अप्रबंधित संसाधन क्या हैं जिनके बारे में मुझे अवगत होना चाहिए?

मेरी प्राथमिकता प्रत्येक प्रकार के अप्रबंधित संसाधन (माइक्रोसॉफ्ट के SafeFileHandle के समान) के लिए एक IDisposable कक्षा है। इसलिए, जब भी आप अपने प्रोग्राम/लाइब्रेरी में एक प्रकार का अप्रबंधित संसाधन जोड़ते हैं, तो आपको केवल इसे एक बार संभालना होगा।

प्रश्न तब "कौन से वर्गों का निपटान करना चाहिए?", जिसका एक आसान जवाब है: "IDisposable लागू करने वाले सभी वर्ग।"

क्या यह गलत है या आईडीआईएसओपेबल लागू करने के लिए भ्रामक है?

नहीं एक खाली IDisposable कार्यान्वयन हमेशा एक विकल्प है। आप IDisposable को इंटरफ़ेस या बेस क्लास में जोड़ने पर विचार करें यदि आपको लगता है कि एक कार्यान्वयन उनका उपयोग कर सकता है। यह एक डिजाइन मुद्दा है, जिसे मैं अपने What Your Mother Never Told You आलेख में और अधिक चर्चा करता हूं।

कॉल का निपटान कभी भी एक साथ बंधे होना चाहिए, या क्या हमें बयानों का उपयोग करने पर भरोसा करना चाहिए?

Dispose के लिए Dispose पर सभी सदस्य ऑब्जेक्ट्स पर कॉल करने के लिए यह सामान्य है। अधिक जानकारी के लिए मेरे second rule ब्लॉग पोस्ट देखें।

+0

अस्पष्ट डीवीडी ?? –

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