2009-05-28 28 views
6

Theo các đề xuất của FxCop và khuynh hướng cá nhân của tôi, tôi đã khuyến khích nhóm tôi đang huấn luyện sử dụng ReadOnlyCollections càng nhiều càng tốt. Nếu chỉ để người nhận danh sách không thể sửa đổi nội dung của họ. Trong lý thuyết của họ, đây là bánh mì & bơ. Vấn đề là giao diện của Danh sách <> phong phú hơn nhiều so với tất cả các loại phương pháp hữu ích. Tại sao họ lại chọn lựa đó?Tại sao không ReadOnlyCollection <> bao gồm các phương thức như FindAll(), FindFirst(),

Bạn có từ bỏ và trả lại các bộ sưu tập có thể ghi không? Bạn có trả lại các bộ sưu tập chỉ đọc và sau đó bọc chúng trong nhiều loại ghi không? Ahhhhh.


Cập nhật: Cảm ơn Tôi quen thuộc với khung Thiết kế Hướng dẫn và thats lý do tại sao đội bóng đang sử dụng FxCop để thực thi nó. Tuy nhiên nhóm này đang sống với VS 2005 (tôi biết, tôi biết) và vì vậy nói với họ rằng LINQ/Extension phương pháp sẽ giải quyết vấn đề của họ chỉ làm cho họ buồn.

Họ đã học được rằng List.FindAll() và .FindFirst() cung cấp độ rõ ràng cao hơn viết một vòng lặp foreach. Bây giờ tôi đang đẩy họ sử dụng ReadOnlyCollections họ mất đi sự rõ ràng đó.

Có thể có vấn đề thiết kế sâu hơn mà tôi không phát hiện ra.

- Rất tiếc, bài đăng gốc phải đề cập đến giới hạn VS2005. Tôi đã sống quá lâu đến mức tôi không nhận ra.

Trả lời

6

Mục 8.3.2 của .NET Framework Design Guidelines Second Edition:

DO sử dụng ReadOnlyCollection<T>, một lớp con của ReadOnlyCollection<T>, hoặc trong trường hợp hiếm IEnumerable<T> đối với tài sản hoặc trả lại giá trị đại diện cho bộ sưu tập read-only.

Chúng tôi đi với ReadOnlyCollections để thể hiện ý định của bộ sưu tập được trả lại.

Phương thức List<T> bạn nói được thêm vào .NET 2.0 để thuận tiện. Trong C# 3.0/.NET 3.5, bạn có thể lấy lại tất cả các phương thức đó trên ReadOnlyCollection<T> (hoặc bất kỳ IEnumerable<T>) bằng cách sử dụng các phương thức mở rộng (và sử dụng các toán tử LINQ), vì vậy tôi không nghĩ rằng có động lực để thêm chúng vào các loại khác . Thực tế là chúng tồn tại ở tất cả trong Danh sách chỉ là một lưu ý lịch sử do sự hiện diện của các phương pháp mở rộng hiện có nhưng không có trong 2.0.

+2

Đáng buồn là nhóm bị kẹt trong thời gian dọc của 2.0. –

3

Tôi không có bất kỳ thông tin chi tiết nào về lý do tại sao chúng không được thêm vào ban đầu. Nhưng bây giờ chúng ta có LINQ tôi chắc chắn không thấy lý do gì để thêm chúng vào các phiên bản tương lai của ngôn ngữ. Các phương pháp bạn đã đề cập có thể dễ dàng được viết trong truy vấn LINQ hôm nay. Những ngày này tôi chỉ sử dụng các truy vấn LINQ cho mọi thứ. Tôi thực sự thường xuyên nhận được khó chịu với List<T> có những phương pháp vì nó xung đột với các phương pháp mở rộng tôi viết chống lại IEnumerable<T>.

+0

Đáng buồn là đội bị mắc kẹt trong thời gian dọc của 2.0. –

+0

@Mark, bạn có được phép sử dụng VS2008 để biên dịch mã tương thích C# 2.0 không? Nếu có, bạn chỉ có thể tự xác định các phương thức mở rộng này – JaredPar

+0

Không có vấn đề gì là chúng chưa có giấy phép năm 2008. Rõ ràng kế hoạch di chuyển năm 2008 đã có mặt trên các cuốn sách một thời gian. Nutss #! @ & * # –

7

Trước hết, ReadOnlyCollection<T> thực hiện IEnumerable<T>IList<T>. Với tất cả các phương thức mở rộng trong .NET 3.5 và LINQ, bạn có quyền truy cập gần như tất cả các chức năng từ lớp List<T> gốc về truy vấn, đó là tất cả những gì bạn nên làm với một anyways ReadOnlyCollection<T>.

Điều đó đang được nói, câu hỏi ban đầu của bạn khiến tôi đưa ra một số đề xuất ...

Trả lại List<T> là thiết kế kém, do đó, nó không phải là điểm so sánh. List<T> nên được sử dụng để thực hiện, nhưng đối với giao diện, IList<T> phải được trả lại. Các Framework Design Guidelines đặc biệt nhà nước:

"KHÔNG sử dụng ArrayList hoặc List<T> trong các API công cộng." (Trang 251)

Nếu bạn xem xét điều đó, hoàn toàn không có bất lợi nào đối với ReadOnlyCollection<T> khi so sánh với List<T>. Cả hai lớp này đều thực hiện IEnumerable<T>IList<T>, là các giao diện cần được trả về.

+0

Đáng buồn là nhóm bị mắc kẹt trong thời gian dọc của 2.0. –

+0

@Mark Levison: Ngay cả trong 2.0, bạn phải trả lại IList , không phải Danh sách , vì vậy các nhận xét vẫn được áp dụng. –

0

Tôi nghĩ câu trả lời của Jeff có chứa câu trả lời bạn cần; thay vì ReadOnlyCollection<T>, hãy trả về một phân lớp của nó ... một cái mà bạn tự thực hiện để bao gồm các phương thức mà bạn muốn sử dụng mà không cần nâng cấp lên VS2008/LINQ.

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