【问题标题】:Why is CompareTo on short implemented this way?为什么要以这种方式实现 CompareTo?
【发布时间】:2023-04-01 06:58:01
【问题描述】:

考虑以下代码:

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

【问题讨论】:

    标签: .net compareto design-decisions


    【解决方案1】:

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

    换句话说,具体原因是您可以使用short 的快捷方式(没有双关语),而同样的快捷方式不适用于int。您绝对不应该要求 IComparable&lt;T&gt;.CompareTo 实现返回 -1、0 或 1。文档很清楚,结果仅在负数、零或正数方面才有意义。

    【讨论】:

    • 感谢您的回答。没有考虑溢出问题。不幸的是,我必须维护一个包含大量代码的遗留应用程序,假设 CompareTo 总是返回 -1、0 或 1...
    • @dkson:我建议你修复遗留代码。这种假设只会一直咬你,直到你最终解决它。最好早点而不是晚点 - 并教育最初的开发人员,如果他们还在的话......
    【解决方案2】:

    好吧,你应该只检查符号无论如何,但原因是:我猜int 等会有溢出/换行的风险(在处理 2 个大数字时)这将反转符号,这意味着它必须检查运算符。

    我宁愿它是一致的,但这似乎不是问题。更有可能是非典型的优化,但在记录的 API 中。特别是,在这里优化short 感觉不会获得大量 的使用量(我使用 short,但没有任何东西和我一样喜欢 int)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多