2014-11-02 19 views
11

gì là thực hành tốt nhất trong C# bắt đầu từ phiên bản 4.0 khi viết một lớp Comparer:Chúng ta có nên mở rộng Comparer <T> hoặc thực hiện IComparer <T>

a. Chúng ta có nên kế thừa từ lớp trừu tượng Comparer không? hoặc

b. Chúng ta có nên thực hiện giao diện IComparer.

Ưu và khuyết điểm là gì?

+0

triển khai 'IComparer' – mihai

+0

tôi nghĩ rằng việc triển khai' IComparer' là cách tốt hơn, vì nó có thể được sử dụng sau trong LINQ. – W92

+0

Thừa kế từ so sánh. Msdn nói với bạn tại sao. Bằng cách đó bạn sẽ có được mặc định.so sánh hành vi –

Trả lời

12

Tôi khuyên bạn nên mở rộng lớp Comparer<T> thay vì triển khai giao diện IComparer<T>, cũng như Microsoft (xem tham khảo đầu tiên bên dưới).

Bây giờ, nếu bạn muốn chính đối tượng của mình (bất kể T là gì) để có thể so sánh với chính nó, nó có thể thực hiện giao diện IComparable (xem tham chiếu thứ hai bên dưới).


Từ: http://msdn.microsoft.com/en-us/library/8ehhxeaf(v=vs.110).aspx (IComparer<T>)

Chúng tôi khuyên bạn nên xuất phát từ lớp Comparer<T> thay vì thực hiện các giao diện IComparer, bởi vì lớp Comparer<T> cung cấp một thực hiện giao diện rõ ràng của IComparer.Compare phương pháp và Default thuộc tính được so sánh mặc định cho đối tượng.

Từ: http://msdn.microsoft.com/en-us/library/cfttsh47(v=vs.110).aspx (Comparer<T>)

bắt nguồn từ lớp học này nhằm cung cấp một cài đặt tùy chỉnh giao diện IComparer<T> để sử dụng với các lớp học tập như SortedList<TKey, TValue>SortedDictionary<TKey, TValue> lớp generic. Sự khác biệt giữa phát sinh từ các lớp Comparer và thực hiện các giao diện System.IComparable là như sau:

  • Để xác định như thế nào hai đối tượng nên được so sánh theo mặc định, thực hiện các giao diện System.IComparable trong lớp học của bạn. Điều này đảm bảo rằng các hoạt động sắp xếp sẽ sử dụng mã so sánh mặc định mà bạn đã cung cấp.
  • Để xác định trình so sánh để sử dụng thay vì trình so sánh mặc định, lấy được từ lớp Comparer. Sau đó, bạn có thể sử dụng trình so sánh này trong các phép toán sắp xếp để so sánh như một tham số.
+0

_ "Bắt nguồn từ lớp này" _ - lớp nào? Tôi lấy nó, bạn có nghĩa là 'Comparer '? – MickyD

+0

Đó là một trích dẫn trực tiếp từ trang MSDN trên 'Comparer ', vì vậy có. –

+3

Tôi nhận ra rằng, nhưng đọc câu trả lời của bạn thì không rõ bạn đang nói về điều gì. Tôi phải nhấp vào liên kết để tìm hiểu. Bạn nên bắt đầu bằng cách nói _ "Tôi đề nghị' So sánh Lớp '..." _. _ [Câu trả lời của bạn nằm trong một lâu đài khác: khi nào câu trả lời không phải là câu trả lời?] (Http://meta.stackexchange.com/questions/225370/your-answer-is-in-another-castle-when-is-an -answer-not-an-answer) _ – MickyD

1

Từ this article on MSDN:

Chúng tôi khuyên bạn nên xuất phát từ lớp Comparer thay vì thực hiện các giao diện IComparer, bởi vì lớp Comparer cung cấp một thực hiện giao diện rõ ràng của phương pháp IComparer.Compare và mặc định tài sản được so sánh mặc định cho đối tượng.

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