2009-07-20 10 views
7

मुझे लुकअप टेबल (सादा पुराना डिक्शनरी <>) में IDisposable ऑब्जेक्ट्स का गुच्छा मिला है, लेकिन कोड को सरल बनाने और त्रुटि से बचने के लिए मैं एक संग्रह कक्षा की तलाश में हूं जो " "वह वस्तुओं का मालिक है, और पहिया को पुनर्निर्मित करने से बचने के लिए - क्या ऐसी कक्षा पहले से मौजूद है?IDISposable ऑब्जेक्ट्स के लिए मानक संग्रह

विनिर्देश यह होना चाहिए कि: - संग्रह डिस्पोजेबल होना चाहिए, और जब इसे निपटाया जाता है तो सभी निहित वस्तुओं को भी निपटान किया जाना चाहिए। - जब भी कोई आइटम हटा दिया जाता है, तो यह Dispose() -d पहले होता है। - आदर्श रूप से, संग्रह IDisposable-निहित प्रकार की आवश्यकता को लागू करने वाली प्रकार की बाधा के साथ सामान्य होगा।

मैं sorta शक इस तरह के एक वर्ग मौजूद है, लेकिन मैं सुखद दिया ReadOnlyCollection और इससे पहले कि ObservableCollection के अस्तित्व से हैरान है ...

अनिवार्य रूप से, मैं के लिए सी ++ एसटीएल कंटेनर के बराबर है, लेकिन फिर चाहें सीएलआर ;-)।

+0

यह थोड़ा समय हो गया है। क्या आपने एक आईडीस्पोजेबल कोलेक्शन बनाया था? मैं भी इसका इस्तेमाल कर सकता था। – JohnV

+0

नहीं; मैं संग्रह को लपेटकर समाप्त कर दिया और वास्तव में केवल (बहुत) कुछ विधियों को उजागर कर रहा हूं - मुझे जोड़ने/प्राप्त/हटाएं - और उस विशेष चीज़ के लिए कुछ अतिरिक्त कार्यक्षमता जिस पर मैंने काम किया है (फाइल-सिस्टम वॉचर्स के बहुत सारे)। –

उत्तर

1

आप CompositeDisposable खोज रहे हैं।

using System.Reactive.Disposables; 

    ... 

    CompositeDisposable xs = new CompositeDisposable(Disposable.Empty); 
    xs.Add(Disposable.Empty); 
    xs.Add(Disposable.Empty); 
    xs.Dispose(); 
+0

गैर सामान्य।यह काफी आदर्श नहीं है; लेकिन या तो एक बड़ा मुद्दा नहीं है। –

+0

आरएक्स एक्सटेंशन .NET ढांचे का हिस्सा नहीं हैं। हालांकि कई लोगों के लिए कोई समस्या नहीं है, केवल एक छोटी कक्षा के लिए संपूर्ण पुस्तकालय का संदर्भ देना बहुत अच्छा विचार नहीं होगा। – arbiter

+0

@arbiter का एक बिंदु है, हालांकि आईएमएचओ आरएक्स का उपयोग नहीं करने में ज्यादा बिंदु नहीं है। एक बार जब आप किसी प्रोजेक्ट में .NET का उपयोग करने के बड़े पैमाने पर ओवरहेड खींचने का निर्णय ले लेते हैं, तो कोई भी उपयोगी पुस्तकालय लाने के बारे में चिंतित नहीं होना चाहिए। –

0

मैं देख रहा हूं कि आप क्या पूछ रहे हैं, लेकिन इसे हटाने से पहले तत्व को निपटाने के लिए यह कितना मुश्किल है?

+0

बिल्कुल मुश्किल नहीं है - लेकिन यदि संभव हो तो इसे टालने के लिए क्लीनर होगा। और, यह केवल निकालें नहीं है, दाएं - किसी भी विधि जो किसी तत्व को ओवरराइट कर सकती है वह एक मौजूदा तत्व को पूरी तरह से बदल रही है, जिसे निपटाना() 'डी भी होना चाहिए। यदि आपका संग्रह कुछ मानक इंटरफेस लागू करता है, तो इन निकालने/सेटर फ़ंक्शंस के कुछ प्रकार हो सकते हैं, जिससे कोड ब्लोट होता है। –

2

जो मुझे पता है, वहां केवल आईसीओम्पोनेंट्स के लिए इस तरह के संग्रह से बाहर निकलता है - Container implements IContainer। सामान्य आईडीस्पोज़ेबल के लिए मुझे लगता है कि आपके पास कोई अन्य विकल्प नहीं है लेकिन "पहिया को फिर से शुरू करें"।

+0

धन्यवाद, मैं इसमें देखूंगा (हालांकि यह थोड़ा भारी वजन दिखता है - एपीआई में सामानों का एक गुच्छा है जिसका मैं उपयोग नहीं करूँगा - इससे कोई फर्क नहीं पड़ता)! –

+0

कंटेनर और सिस्टम। कॉम्पोनेंट मॉडल सामान्य उपयोग के लिए अत्यधिक जटिल और अपर्याप्त रूप से लचीला प्रतीत होता है। संक्षेप में, मैं आपके उत्तर को स्वीकार कर रहा हूं कि मेरे पास "पहिया को फिर से शुरू करने" के अलावा कोई अन्य विकल्प नहीं है। –

1

याद रखें कि आपका संग्रह डिस्पोजेबल ऑब्जेक्ट्स वाला एकमात्र व्यक्ति नहीं हो सकता है ... क्या होगा यदि कोई अन्य ऑब्जेक्ट (संग्रह के बाहर) उन में से किसी एक का संदर्भ दे रहा हो? यदि संग्रह का निपटारा करते समय आप इसका निपटान करते हैं, तो ऑब्जेक्ट का क्या होगा?

यदि ये वस्तुएं कुछ अप्रबंधित संसाधनों की सफाई के लिए IDisposable लागू करती हैं तो सुनिश्चित करें कि वे अंतिम रूप से कार्यान्वयन को लागू करते हैं और वहां अप्रबंधित संसाधनों का निपटान करते हैं।

+0

मैं वर्तमान में वस्तुओं और संग्रह दोनों को पूरी तरह से नियंत्रित करता हूं - इसलिए यह एक काल्पनिक स्थिति है। किसी भी स्थिति में; यह वही तरीका है जो चीजों को IDisposables के साथ काम करता है, है ना? मेरा मतलब है, * किसी को * (यानी अंततः निपटान) का स्वामित्व करना है, और इस मामले में मालिक आईडीआईस्पोजेबल की एक चर संख्या के मालिक होने के लिए होता है, इसलिए संग्रह सबसे सरल होगा। –

0

कुछ इस तरह के बारे में कैसे:

public class DisposableEnumerable<T> : IEnumerable<T>, IDisposable where T : IDisposable 
{ 
    IEnumerable<T> Enumerable { get; } 

    public DisposableEnumerable(IEnumerable<T> enumerable) 
    { 
     Enumerable = enumerable; 
    } 

    public IEnumerator<T> GetEnumerator() 
    { 
     return Enumerable.GetEnumerator(); 
    } 

    IEnumerator IEnumerable.GetEnumerator() 
    { 
     return Enumerable.GetEnumerator(); 
    } 

    public void Dispose() 
    { 
     foreach(var disposable in Enumerable) 
     { 
      disposable.Dispose(); 
     } 
    } 
} 
+0

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

+0

इसके अलावा: भले ही ऐसा नहीं होना चाहिए, आपको यह समझना चाहिए कि क्या होता है यदि अंतर्निहित 'निपटान()' फेंकता है। –

+0

अच्छा बिंदु, धन्यवाद। –

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