2010-07-18 29 views
9

Tôi đang triển khai IDisposable cho một lớp và trong khi xử lý có một danh sách nội bộ các đối tượng dùng một lần. Tôi có nên xử lý các đối tượng đó bằng cách lặp qua chúng không.Làm thế nào để vứt bỏ một danh sách các vật dụng dùng một lần?

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

Từ khóa "Quá tải" sai, hãy xóa nó. VB.NET IDE tạo mã boilerplate không phù hợp cho 99,9% của tất cả các triển khai IDisposable. Chỉ cần di chuyển mã xử lý sang Sub Dispose() và loại bỏ phương thức được bảo vệ và SuppressFinalize. –

+0

@Hans, Bạn có thể cho biết lý do đề xuất của mình không? – Joker

+0

Mã boilerplate chỉ thích hợp khi bạn thực hiện một finalizer. Điều đó cực kỳ hiếm. –

Trả lời

10

Có, lặp qua danh sách và xử lý từng mục.

Ngoài ra bạn có thể viết một phương pháp khuyến nông:

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 
      } 
    } 
} 

và gọi nó là cho danh sách của bạn

_disposbaleObjects.Dispose() 
+0

VB.Net có phương pháp mở rộng không? –

+0

@Moron: Có nó http://msdn.microsoft.com/en-us/library/bb384936.aspx – abatishchev

+0

+1 rồi ..... :) –

2

Có, bạn cần phải vứt bỏ mỗi một trong các đối tượng một cách rõ ràng, chính xác theo cách bạn làm nó bây giờ.

2

Ai tạo các đối tượng bên trong danh sách? tức là ai chịu trách nhiệm cho vòng đời của họ? Nếu MyDisposable tạo ra chúng, thì đó là trách nhiệm xử lý chúng. Nếu ai đó tạo ra chúng, việc xử lý chúng có thể khiến chúng có tham chiếu đến một đối tượng vô dụng.

+0

MyDisposable tạo danh sách các đối tượng. – Joker

Các vấn đề liên quan