2011-12-27 19 views
9

Tôi đang triển khai IComparableIComprable<T> trong một trong các lớp học của mình. Có bất kỳ đề xuất về cách thức CompareTo phương pháp trong từng trường hợp nên hành xử khi đưa ra một đối số null? Nó có nên trả về một số dương hoặc ném một số ArgumentNullException không? Hoặc hành vi này có thể khác nhau tùy thuộc vào lớp thực hiện?Hành vi IComparable cho đối số rỗng

Tôi thấy tài liệu MSDN (herehere) nhưng không có gì để nói về chủ đề này. Bất kỳ trợ giúp sẽ được đánh giá cao.

Trả lời

9

Cả hai tài liệu tham khảo MSDN cho IComparable.CompareTo()IComparable<T>.CompareTo() nhà nước như sau:

Theo định nghĩa, bất kỳ đối tượng so sánh lớn hơn (hoặc sau) Nothing, và hai tài liệu tham khảo vô so sánh tương đương với nhau.

Nothing trong VB tương ứng với null trong C#.

Lưu ý rằng tình trạng trước đó đoạn:

Ý nghĩa của sự so sánh, "ít hơn", "bằng" và "lớn hơn", phụ thuộc vào việc thực hiện cụ thể.

Nhưng các tham chiếu mẫu không phải là rỗng luôn lớn hơn tham chiếu null, bất kể bạn so sánh các trường hợp của lớp học như thế nào.

12

tôi thấy tài liệu MSDN nhưng nó không có gì để nói về chủ đề này

Có nó, nhưng không phải là rất rõ ràng. Các tài liệu khẳng định:

Theo định nghĩa, bất kỳ đối tượng so sánh lớn hơn (hoặc sau) Không có gì, và hai tài liệu tham khảo vô so sánh tương đương với nhau.

Tài liệu này gây nhầm lẫn vì nó trộn thành ngữ từ C# (null) và VB (Không có gì) trong cùng một câu. Tôi sẽ đề cập đến người quản lý tài liệu.

Lưu ý rằng cùng một quy tắc áp dụng cho các loại giá trị có thể vô hiệu. Nếu bạn sắp xếp một danh sách các số nguyên nullable, thì 1 được coi là lớn hơn null cho các mục đích sắp xếp. Hãy cẩn thận; đây không phải là cách các số nguyên nullable so sánh theo mặc định trong C#.

+0

Lưu ý rằng nếu bạn nhấp vào tab C# dưới Cú pháp trên trang http://msdn.microsoft.com/en-us/library/system.icomparable.compareto.aspx, văn bản sẽ thay đổi thành "... so sánh lớn hơn (hoặc sau) null và hai tham chiếu null ... " – phoog

+0

@phoog: Tốt! Tôi đã không nhận thấy điều đó. –

5

Đảm bảo sử dụng Object.ReferenceEquals để kiểm tra xem đối số có được chuyển đến CompareTo không. Tránh sử dụng các toán tử == và! = Trong các phương thức CompareTo bởi vì ai đó có thể thực sự theo gợi ý MSDN để ủy nhiệm các toán tử đó quay lại phương thức CompareTo, điều này sẽ tạo ra một vòng lặp vô hạn và tràn ngăn xếp (!) Trong nháy mắt.

Đây là một mô hình như thế nào bạn có thể cố gắng thực hiện phương pháp CompareTo:

public class Piano : IComparable<Piano> 
{ 

    public float Mark { get; set; } 

    public int CompareTo(Piano other) 
    { 
     // The very basic implementation of CompareTo 

     if (object.ReferenceEquals(other, null)) 
      return 1; // All instances are greater than null 

     return Mark.CompareTo(other.Mark); 

    } 

} 

Mã nguồn toàn với lời giải thích trên this địa chỉ.