为什么CompareTo简称以这种方式实现?

时间:2011-07-05 08:41:27

标签: .net compareto design-decisions

请考虑以下代码:

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();
        }
    } 
}

我的问题是,Int16上的CompareTo方法返回除-1,0和1以外的值有什么特殊原因吗?

ILSpy显示它以这种方式实现

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

而这个方法是以这种方式在Int32上实现的

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

2 个答案:

答案 0 :(得分:13)

不同之处在于short,结果不会溢出。例如,short.MinValue - (short) 1仍为负数,而int.MinValue - 1int.MaxValue

换句话说,具体原因是您可以使用short(没有双关语)的快捷方式,而相同的快捷方式不适用于int。你绝对不应该要求 IComparable<T>.CompareTo实现返回-1,0或1.文档非常清楚,结果只有在负,零或正面方面才有意义。< / p>

答案 1 :(得分:5)

好吧,你应该只检查的标志,但原因是:我想int等会有溢出/换行的风险(当处理2个大幅度时)数字)会反转符号,这意味着必须检查运算符。

我宁愿它是一致的,但它似乎不是一个问题。更可能是非典型但在记录的API内的优化。特别是,在这里优化short并不意味着它将获得大量使用量(我使用 short,但不是任何喜欢int}一样。