2010-07-18 10 views
9

मैं कक्षा के लिए IDISposable लागू कर रहा हूं और निपटान करते समय डिस्पोजेबल वस्तुओं की एक आंतरिक सूची है। क्या मुझे उन वस्तुओं को उनके माध्यम से लूप करके निपटाना चाहिए।डिस्पोजेबल वस्तुओं की सूची का निपटान कैसे करें?

public Class MyDisposable 
    Implements IDisposable 
    private _disposbaleObjects as new List(of OtherDisposables) 

    Public Overloads Sub Dispose() Implements System.IDisposable.Dispose 
     Dispose(True) 
     GC.SuppressFinalize(Me) 
    End Sub 

    Protected Overridable Sub Dispose(ByVal disposing As Boolean) 
     If Not Me.disposedValue Then 
      If disposing Then 
        ? Should I dispose the the list like this ? 
        For Each obj In _disposbaleObjects 
         obj.dispose() 
        Next 
      End If    
     End If 
     Me.disposedValue = True 
    End Sub 

End Class 
+2

"अधिभार" कीवर्ड गलत है, इसे हटा दें। वीबीएनईटी आईडीई सभी आईडीस्पोजेबल कार्यान्वयन के 99.9% के लिए अनुचित बॉयलरप्लेट कोड उत्पन्न करता है। बस निपटान कोड को उप निपटान() पर ले जाएं और संरक्षित विधि से छुटकारा पाएं और SuppressFinalize से छुटकारा पाएं। –

+0

@ हंस, क्या आप अपने सुझाव के कारण बता सकते हैं? – Joker

+0

बॉयलरप्लेट कोड केवल तभी उपयुक्त होता है जब आप फ़ाइनलाइज़र को कार्यान्वित करते हैं। यह बेहद दुर्लभ है। –

उत्तर

10

हां, सूची के माध्यम से पुन: प्रयास करें और प्रत्येक आइटम का निपटान करें।

इसके अलावा, आप एक विस्तार विधि लिख सकते हैं:

public static void Dispose(this IEnumerable<IDisposable> collection) 
{ 
    foreach (IDisposable item in collection) 
    { 
     if (item != null) 
     { 
      try 
      { 
       item.Dispose(); 
      } 
      catch (Exception) 
      { 
       // log exception and continue 
      } 
    } 
} 

और यह अपनी सूची के लिए फोन

_disposbaleObjects.Dispose() 
+0

क्या VB.Net में विस्तार विधियां हैं? –

+0

@ मॉरन: हाँ यह http://msdn.microsoft.com/en-us/library/bb384936.aspx – abatishchev

+0

+1 तब ..... :) –

2

हाँ, आप इन वस्तुओं में से प्रत्येक को स्पष्ट रूप से निपटाने के लिए, वास्तव में जिस तरह से आप कर रहे हैं की जरूरत है अभी कर रहा हूँ।

2

सूची के अंदर वस्तुओं को कौन बनाता है? यानी उनके जीवन चक्र के लिए कौन जिम्मेदार है? यदि MyDisposable उन्हें बनाता है, तो उनका निपटान करना उनकी ज़िम्मेदारी है। अगर कोई और उन्हें बनाता है, तो उनका निपटान उन्हें बेकार वस्तु के संदर्भ में छोड़ सकता है।

+0

MyDisposable ऑब्जेक्ट्स की सूची बनाता है। – Joker

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