Nếu tôi có một chức năng thu thập một loại nhất định, tôi nên sử dụng loại tham số nào?
Trước đây tôi đã giả định IEnumerable
là mặc định, nhưng tôi muốn biết điều này có đúng không và nếu có thì tại sao.
ICollection
cũng có vẻ giống như một ứng cử viên hợp lệ (do tên của nó), nhưng tôi nhận được ấn tượng IEnumerables thân thiện với người dùng hơn.
Tôi đã tìm ra các ví dụ mà khung công tác mang lại cho chúng tôi sẽ là một ý tưởng hay, nhưng tôi thấy rằng một cái gì đó giống như String.Join
, yêu cầu một chuỗi các chuỗi.Thông số chức năng: IEnumerable, ICollection hoặc array?
Trả lời
Bạn lấy một sản phẩm ít áp dụng nhất cho khách hàng nhưng cho phép bạn hoàn thành công việc của mình. Nếu bạn có thể lấy đi với IEnumerable<T>
trên ICollection<T>
, thì bạn nên sử dụng nó vì điều này mang đến sự linh hoạt hơn cho khách hàng của API của bạn.
IEnumerable được ưu tiên hơn ICollections. Here là câu trả lời hào phóng cho câu hỏi của bạn.
Giao diện chủ yếu được sử dụng làm thông số hoặc trả về các loại trong các hàm để hỗ trợ SOLID
Nguyên tắc thiết kế (Nguyên tắc phân đoạn giao diện) để đúc dễ dàng hơn, hỗ trợ chuyển nhiều loại bê tông đến tham số giao tiếp và ẩn (đóng gói) loại tham số từ khách hàng của các chức năng công cộng của bạn.
- Về
IEnumerable
:
Rất cơ bản, nó cho thấy nhiều điều tra viên, trong đó hỗ trợ một lần lặp đơn giản qua một bộ sưu tập không chung chung.
[ComVisibleAttribute(true)]
public interface IEnumerable
- Dưới đây là về
ICollection
: giao diện
Các ICollection mở rộng IEnumerable; IDictionary và IList là các giao diện chuyên biệt hơn để mở rộng ICollection. Việc thực hiện IDictionary là tập hợp các cặp khóa/giá trị, như lớp Hashtable. Việc thực hiện IList là một tập hợp các giá trị và các thành viên của nó có thể được truy cập bằng chỉ mục, giống như lớp ArrayList. Một số bộ sưu tập giới hạn quyền truy cập vào các phần tử của chúng, chẳng hạn như lớp Queue và lớp Stack, trực tiếp triển khai giao diện ICollection. Nếu cả giao diện IDictionary lẫn giao diện IList đều không đáp ứng các yêu cầu của bộ sưu tập bắt buộc, lấy được lớp sưu tập mới từ giao diện ICollection thay vì linh hoạt hơn.
[ComVisibleAttribute(true)]
public interface ICollection : IEnumerable
Dưới đây là về
IList
giao diện:[ComVisibleAttribute (true)] public interface IList: ICollection, IEnumerable
Thêm từ MSDN về IList: IList
là một hậu duệ của giao diện ICollection
và là giao diện cơ bản của tất cả các li không chung sts. Việc triển khai IList rơi vào ba danh mục: chỉ đọc, kích thước cố định và biến số. Không thể sửa đổi IList chỉ đọc.Một IList kích thước cố định không cho phép bổ sung hoặc loại bỏ các phần tử, nhưng nó cho phép sửa đổi các phần tử hiện có. Một IList kích thước biến cho phép bổ sung, loại bỏ và sửa đổi các phần tử.
Mẹo:
Trong trường hợp bạn chỉ muốn hỗ trợ
foreach
cho tham số bộ sưu tập của bạn,IEnumerable
nên là đủ. Trong trường hợp bạn cũng muốn hỗ trợ để thêm và xóa các mục khỏi bộ sưu tập,IList
là lựa chọn tốt hơn.
Gợi ý: bài viết trên blog này: IEnumerable, ICollection, IList Compared chắc chắn sẽ giúp bạn chụp tốt hơn và quyết định chính xác.
Ngoài ra, hãy xem this article để biết hiệu suất và các so sánh khác về IList và IEnumerable.
-1: Tôi không thể không đồng ý nhiều hơn nữa. ** Luôn luôn ** (cho một giá trị nhất định luôn luôn) sử dụng trừu tượng tối thiểu để hoàn thành công việc, theo cách mã khách hàng của bạn (mã bạn đang viết) không bị ràng buộc khi sử dụng cùng một vùng chứa, bạn có chức năng trở nên chung chung hơn và có tiềm năng lớn hơn để tái sử dụng. –
Vâng @BinaryWorrier Tôi cập nhật câu trả lời để sử dụng IList là lựa chọn duy nhất khi hỗ trợ thêm hoặc xóa các mục là bắt buộc và sử dụng IEnumerable nếu chỉ hỗ trợ foreach là bắt buộc .. Tôi hy vọng bạn đã hiểu câu trả lời tốt hơn ngay bây giờ .. – VS1
Xin lỗi nhưng tôi vẫn không đồng ý. 'IEnumerable
- 1. Dừng WCF Deserializing trống ICollection vào Zero năng lực Array
- 2. Thông số chức năng: Sao chép hoặc con trỏ?
- 3. Force protobuf-net để bỏ qua giao diện IEnumerable/ICollection
- 4. Thông số chức năng - Python
- 5. Thông số chức năng số tối đa
- 6. Javascript: thông số "Infinite" cho chức năng?
- 7. Thông số mẫu chức năng không kiểu
- 8. thông số và chức năng quyền hạn
- 9. Nhiều thông số tùy chọn chức năng
- 10. Thực hiện IEnumerable với một Array
- 11. EF ICollection Vs Danh sách Vs IEnumerable Vs IQueryable
- 12. Tại sao ArrayList thực hiện IList, ICollection, IEnumerable?
- 13. Viết thông số chức năng cho các trò chơi
- 14. Postgres - Chức năng trả về giao điểm của 2 ARRAY?
- 15. Chức năng JavaScript Array nào đang thay đổi?
- 16. Go - thông số chức năng variadic pass-through
- 17. thông số chức năng có và không có() trong Scala
- 18. phát lại danh sách các chức năng và thông số
- 19. Chức năng như thông số mẫu phát hành
- 20. XCode Hiển thị thông số chức năng Hotkey
- 21. Thông số chức năng gợi ý Eclipse với PyDev
- 22. Trình tự đánh giá trong ++ chức năng C thông số
- 23. Node.js "đòi hỏi" chức năng và thông số
- 24. Tại sao các thông số chức năng của loại size_t?
- 25. C++ Chức năng Template instantiaion với các thông số ngầm
- 26. PHP chức năng như thông số mặc định
- 27. Phương pháp mở rộng đơn trên IDictionary <K, IEnumerable/IList/ICollection <V>>
- 28. đối số chức năng
- 29. Thư viện chức năng Javascript nào: Gạch dưới hoặc wu.js hoặc Chức năng hoặc ...?
- 30. đối số chức năng động
này đã được trả lời trước đây: http://stackoverflow.com/questions/3559868/list-ilist-ienumerable-iqueryable-icollection-which-is-most-flexible-return nhất Trân trọng. – Oscar
['String.Join'] (http://msdn.microsoft.com/en-us/library/dd992421.aspx) có quá tải được thêm vào trong khung thời gian .NET 4 để nó có một' IEnumerable'. Quá tải lấy các ngày mảng từ ngày trước ngày chung chung ... –
@ Oscar: đó là về kiểu trả về — tôi đang nói tham số. –