Sự khác biệt chính giữa IComparable và IComparable <> là người đầu tiên là trước Generics để cho phép bạn gọi phương thức so sánh với bất kỳ đối tượng, trong khi thứ hai thực thi mà nó chia sẻ cùng loại:
IComparable - CompareTo(object other);
IComparable<T> - CompareTo(T other);
Tôi sẽ đi với tùy chọn thứ hai miễn là bạn không có ý định sử dụng bất kỳ thư viện .net 1.0 cũ nào mà các loại có thể không thực hiện giải pháp hiện đại, chung chung. Bạn sẽ đạt được một hiệu suất tăng kể từ khi bạn sẽ tránh boxing và so sánh sẽ không cần phải kiểm tra các loại phù hợp và bạn cũng sẽ nhận được cảm giác ấm áp đến từ làm việc theo cách cắt ... Cạnh tranh nhất
Để giải quyết điểm rất tốt và thích hợp của Jeff, tôi cho rằng thực hành tốt là đặt ít ràng buộc vào chung chung như được yêu cầu để thực hiện nhiệm vụ. Vì bạn đang kiểm soát hoàn toàn mã bên trong chung, bạn biết liệu bạn có đang sử dụng bất kỳ phương thức nào yêu cầu một loại IComparable cơ bản hay không. Vì vậy, tham gia bình luận của ông xem xét cá nhân tôi sẽ làm theo các quy tắc:
Nếu bạn không mong đợi sự chung để sử dụng bất kỳ loại mà chỉ thi IComparable (tức là di sản 1,0 code) và bạn không gọi bất kỳ các phương thức từ bên trong chung mà dựa vào tham số IComparable, sau đó chỉ sử dụng ràng buộc IComparable <>.
Nếu bạn là sử dụng các loại mà chỉ thực hiện IComparable sau đó sử dụng hạn chế chỉ
Nếu bạn đang sử dụng phương pháp đòi hỏi một tham số IComparable, nhưng không sử dụng các loại mà chỉ thực hiện IComparable sau đó sử dụng cả những hạn chế như trong câu trả lời của Jeff sẽ tăng hiệu suất khi bạn sử dụng các phương thức chấp nhận loại chung.
Để mở rộng trên quy tắc thứ ba - hãy giả sử rằng lớp bạn đang viết như sau:
public class StrangeExample<T> where ... //to be decided
{
public void SortArray(T[] input)
{
Array.Sort(input);
}
public bool AreEqual(T a, T b)
{
return a.CompareTo(b) == 0;
}
}
Và chúng ta cần phải quyết định những gì khó khăn để đặt vào nó. Phương thức SortArray gọi Array.Sort yêu cầu mảng được truyền vào để chứa các đối tượng thực thi IComparable. Vì vậy chúng tôi phải có một hạn chế IComparable:
public class StrangeExample<T> where T : IComparable
Bây giờ lớp sẽ biên dịch và hoạt động chính xác như một mảng của T có giá trị trong Array.Sort và có một phương pháp .CompareTo hợp lệ theo quy định tại giao diện. Tuy nhiên, nếu bạn chắc chắn rằng bạn sẽ không muốn sử dụng lớp học của bạn với một loại mà không còn thực hiện IComparable <> giao diện bạn có thể mở rộng hạn chế của mình để:
public class StrangeExample<T> where T : IComparable, IComparable<T>
Điều này có nghĩa rằng khi AreEqual được gọi nó sẽ sử dụng phương thức CompareTo nhanh hơn, chung chung và bạn sẽ thấy một lợi ích hiệu suất với chi phí không thể sử dụng nó với các kiểu .NET 1.0 cũ.
Mặt khác, nếu bạn không có phương pháp AreEqual thì không có lợi thế nào đối với giới hạn IComparable <> do đó bạn cũng có thể thả nó - bạn chỉ đang sử dụng các triển khai IComparable.
bruno: trong mã của bạn, tôi muốn ủy quyền công việc so sánh trong CompareTo (đối tượng) với CompareTo (MyType) trong nhánh thứ hai của CompareTo (đối tượng), thay vì sao chép mã. – Steve