2010-03-12 27 views
11

Nếu tôi phơi bày bộ thành viên nội bộ thông qua một tài sản Collection qua:Bộ sưu tập <T> có bao gồm IList <T> hoặc liệt kê trên IList <T> không?

public Collection<T> Entries 
{ 
    get { return new Collection<T>(this.fieldImplimentingIList<T>); } 
} 

Khi thuộc tính này được gọi là những gì sẽ xảy ra? Ví dụ: những gì xảy ra khi các dòng mã sau đây được gọi là:

T test = instanceOfAbove.Entries[i]; 
instanceOfAbove[i] = valueOfTypeT; 

Rõ ràng mỗi khi thuộc tính này được gọi là loại tham chiếu mới được tạo nhưng điều gì xảy ra một cách tình cờ? Nó chỉ đơn giản là bọc IList<T> bên dưới, nó liệt kê trên IList<T> và để tạo ra một ví dụ Collection<T> mới? Tôi lo ngại về hiệu suất nếu thuộc tính này được sử dụng trong vòng lặp for.

+0

'Bộ sưu tập ' kết thúc tốt đẹp 'IList '. Tại sao bạn trả lại nó làm Bộ sưu tập ? Tại sao không hiển thị nó như là một IE2 có thể đếm được ? Bạn đang cố gắng để ngăn chặn sửa đổi vào danh sách cơ bản? –

+0

Cảm ơn câu hỏi! Tôi đã không nghĩ rằng Bộ sưu tập chỉ là một trình bao bọc trong danh sách;) –

Trả lời

4

Theo Reflector, mới Collection<T> chỉ kết thúc tốt đẹp IList<T>:

public Collection(IList<T> list) 
{ 
    if (list == null) 
    { 
     ThrowHelper.ThrowArgumentNullException(ExceptionArgument.list); 
    } 
    this.items = list; 
} 

Và từ the docs:

Khởi một trường hợp mới của bộ sưu tập < (Tất < (T>)>) lớp làm trình bao bọc cho danh sách được chỉ định.

(nhấn mạnh thêm)

Vì vậy, chi phí là tối thiểu (danh sách không được liệt kê), và thay đổi đối với bộ sưu tập trở lại sẽ ảnh hưởng đến danh sách ban đầu.

(Bằng cách này, tôi giả sử bạn đang đề cập đến System.Collections.ObjectModel.Collection<T> - có không phải là một phiên bản chung của Bộ sưu tập trong namespace cấp cao nhất System.Collections.)

+0

Bạn nói đúng, về không gian tên. Lỗi của tôi. Tôi đã chỉnh sửa tiêu đề câu hỏi. –

2

Theo Reflector - đây là nhà xây dựng của Bộ sưu tập:

public Collection(IList<T> list) 
{ 
    if (list == null) 
    { 
     ThrowHelper.ThrowArgumentNullException(ExceptionArgument.list); 
    } 
    this.items = list; 
} 

Vì vậy, bạn có thể thấy Bộ sưu tập kết thúc tốt đẹp và không sao chép dữ liệu.

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