2009-07-20 38 views
7

Tôi có một đối tượng IDisposable trong bảng tra cứu (từ điển cũ đơn giản <>, ngay bây giờ), nhưng để đơn giản hóa mã và tránh lỗi, tôi đang tìm một lớp thu thập " sở hữu "những vật phẩm mà nó nắm giữ, và để tránh tái phát minh ra bánh xe - một lớp học như vậy đã tồn tại chưa?Bộ sưu tập tiêu chuẩn cho các đối tượng IDisposable

Đặc điểm kỹ thuật phải là: - Bộ sưu tập phải dùng một lần và khi được xử lý, tất cả các mặt hàng chứa cũng phải được xử lý. - Bất cứ khi nào một mục bị xóa, nó là Dispose() -d trước tiên. - lý tưởng, bộ sưu tập sẽ là chung chung với ràng buộc loại thực thi IDisposable -ness của loại được chứa.

tôi sorta nghi ngờ một lớp học như vậy tồn tại, nhưng tôi đã ngạc nhiên bởi sự tồn tại của ReadOnlyCollectionObservableCollection trước ...

Về cơ bản, tôi muốn tương đương với container STL C++ nhưng sau đó cho CLR ;-).

+0

Nó được một thời gian ngắn. Bạn đã tạo IDisposableCollection chưa? Tôi cũng có thể sử dụng nó. – JohnV

+0

Không; Tôi đã kết thúc gói bộ sưu tập và chỉ hiển thị (rất) vài phương pháp tôi thực sự cần - thêm/nhận/xóa - và một số chức năng bổ sung cho điều cụ thể mà tôi đã làm (rất nhiều người theo dõi hệ thống tập tin). –

Trả lời

1

Bạn đang tìm kiếm CompositeDisposable.

using System.Reactive.Disposables; 

    ... 

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

Không chung chung.Điều đó không hoàn toàn lý tưởng; nhưng cũng không phải là một vấn đề lớn. –

+0

Phần mở rộng Rx không phải là một phần của .net framework. Trong khi không phải là một vấn đề đối với nhiều người, nó sẽ không phải là ý tưởng rất hay để tham khảo toàn bộ thư viện chỉ cho một lớp tầm thường. – arbiter

+0

@arbiter có một điểm, mặc dù IMHO không có nhiều điểm trong việc không sử dụng Rx. Một khi bạn đã đưa ra quyết định kéo chi phí khổng lồ của việc sử dụng .net trong một dự án, không ai có thể giải thích về việc đưa vào các thư viện hữu ích. –

0

Tôi thấy những gì bạn đang hỏi nhưng làm cách nào để tạo phương pháp xóa của riêng bạn để phân phối phần tử trước khi bạn xóa nó?

+0

Không khó chút nào - nhưng sẽ sạch hơn nếu tránh nó nếu có thể. Và, nó không chỉ là loại bỏ, phải - bất kỳ phương pháp nào có thể ghi đè lên một phần tử được thay thế hoàn toàn một phần tử hiện có, mà cũng cần phải được vứt bỏ(). Nếu bộ sưu tập của bạn thực hiện một vài giao diện chuẩn, có thể có một vài biến thể của các hàm gỡ bỏ/setter này, dẫn đến mã bloat. –

2

Từ những gì tôi biết, chỉ có lối ra khỏi bộ sưu tập đó cho IComponents - Container implements IContainer. Đối với IDisposable chung tôi nghĩ bạn không có lựa chọn nào khác ngoài việc "tái tạo lại bánh xe".

+0

Cảm ơn, tôi sẽ xem xét nó (mặc dù có vẻ hơi nặng - API có nhiều thứ mà tôi sẽ không sử dụng - điều đó có thể không quan trọng)! –

+0

Container và System.ComponentModel có vẻ quá phức tạp và không đủ linh hoạt để sử dụng chung. Tóm lại, tôi chấp nhận câu trả lời của bạn rằng tôi không có lựa chọn nào khác ngoài việc "tái tạo lại bánh xe". –

1

Hãy nhớ rằng bộ sưu tập của bạn có thể không phải là bộ duy nhất chứa các đối tượng dùng một lần ... Điều gì sẽ xảy ra nếu một đối tượng khác (bên ngoài bộ sưu tập) tham chiếu một trong số đó? Nếu bạn vứt bỏ nó khi bộ sưu tập được xử lý, thì điều gì sẽ xảy ra với đối tượng?

Nếu các đối tượng này thực hiện IDisposable đối với một số tài nguyên không được quản lý thì hãy đảm bảo chúng cũng thực hiện quyết toán và xử lý tài nguyên không được quản lý tại đó.

+0

Tôi hiện đang kiểm soát hoàn toàn cả đối tượng và bộ sưu tập - vì vậy đây là một tình huống giả định. Trong bất kỳ trường hợp nào; đó chỉ là cách mọi thứ hoạt động với IDisposables, đúng không? Ý tôi là, * ai đó * phải sở hữu (tức là cuối cùng Vứt bỏ) chúng, và trong trường hợp này chủ sở hữu sẽ sở hữu một số lượng ID có thể thay đổi, do đó, một bộ sưu tập sẽ đơn giản nhất. –

0

Làm thế nào về một cái gì đó như thế này:

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

Tôi nghĩ rằng một kẻ lười biếng liệt kê như một lý lẽ ở đây ít nhất là khó khăn; điều quan trọng là phải biết rằng các đối tượng bạn truyền vào thực sự bị xử lý. Tất nhiên, nếu bộ sưu tập không được sửa đổi thì không quan trọng. –

+0

Ngoài ra: mặc dù nó không nên xảy ra, bạn nên xem xét những gì sẽ xảy ra nếu một cơ bản 'Vứt bỏ()' ném. –

+0

Điểm tốt, cảm ơn. –

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