2011-07-05 18 views
5

Xét đoạn mã sau:Tại sao CompareTo lại được triển khai một cách ngắn gọn theo cách này?

namespace ConsoleApplication1 { 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Console.WriteLine(100.CompareTo(200)); // prints -1 
      Console.WriteLine(((decimal)100).CompareTo((decimal)200)); // prints -1 
      Console.WriteLine(((short)100).CompareTo((short)200)); // prints -100 
      Console.WriteLine(((float)100).CompareTo((float)200)); // prints -1 
      Console.ReadKey(); 
     } 
    } 
} 

Câu hỏi của tôi là, liệu có bất kỳ lý do cụ thể CompareTo-phương pháp trên Int16 trả về giá trị khác hơn là -1, 0 và 1?

ILSpy cho thấy nó được thực hiện theo cách này

public int CompareTo(short value) 
{ 
    return (int)(this - value); 
} 

trong khi phương pháp này là implented trên Int32 cách này

public int CompareTo(int value) 
{ 
    if (this < value) 
    { 
     return -1; 
    } 
    if (this > value) 
    { 
     return 1; 
    } 
    return 0; 
} 

Trả lời

13

Sự khác biệt là cho short, không có cơ hội về kết quả tràn. Ví dụ: short.MinValue - (short) 1 vẫn là số âm - trong khi int.MinValue - 1int.MaxValue.

Nói cách khác, lý do cụ thể là bạn có thể lấy đi bằng phím tắt với short (không có ý định chơi chữ) trong khi phím tắt tương tự không hoạt động với int. Bạn chắc chắn không phải yêu cầuIComparable<T>.CompareTo triển khai để trả về -1, 0 hoặc 1. Tài liệu rõ ràng là kết quả chỉ có ý nghĩa về mặt âm, không hoặc dương.

+1

Cảm ơn câu trả lời của bạn. Đã không nghĩ về vấn đề tràn. Thật không may, tôi phải duy trì một ứng dụng kế thừa chứa rất nhiều mã giả định CompareTo trả về luôn -1, 0 hoặc 1 ... – sloth

+1

@dkson: Tôi khuyên bạn nên sửa mã cũ. Đó là loại giả định sẽ chỉ đơn giản là giữ cắn bạn cho đến khi bạn cuối cùng sửa chữa nó. Tốt hơn để làm điều đó sớm hơn là sau này - và giáo dục các nhà phát triển ban đầu, nếu họ vẫn còn xung quanh ... –

5

Vâng, bạn chỉ nên kiểm tra biển hiệu anyway, nhưng vì lý do: Tôi đoán là int v.v. nghĩa là số phải kiểm tra toán tử.

Tôi thích nó là nhất quán, nhưng nó không có vẻ là một vấn đề. Khả năng tối ưu hóa không điển hình hơn nhưng nằm trong API được ghi nhận. Đặc biệt, tối ưu hóa short ở đây không có cảm giác như nó đang xảy ra để có được một lớn lượng sử dụng (tôi sử dụngshort, nhưng không phải bất cứ điều gì như nhiều như tôi làm int).

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