IComparable<T>.CompareTo() 返回值?

Lee*_*ter 9 c#

只是一个关于该方法的好奇问题IComparable<T>.CompareTo();我知道该方法需要根据比较返回正数、负数或零,但在前两种情况下我返回的内容实际上重要吗?换句话说,我返回+1 或+1000 有什么区别吗?

Far*_*yev 8

答案是:

IComparable<T>.CompareTo()对于 类型,返回减法结果;对于、等类型,sbyte, short, ushort, char返回-1,0 或 1 。intlongstring

var result = ((byte)10).CompareTo((byte)2); // 8
var result = ((short)1).CompareTo((byte)11); // -10
var result = ((int)10).CompareTo((int)11); // 1 ??
Run Code Online (Sandbox Code Playgroud)

原因是:

首先,让我们看一下该方法的签名:

int CompareTo( T 其他 )

如您所见,返回类型是Int32.

开发商想要返还价值差异是显而易见的。但是,减法的返回类型Int32可以小于Int32.MinValue或大于Int32.MaxValue。例如,我们假设:

// Return type is less than minimum int value  (-4294967296)
(Int32.MinValue).CompareTo(Int32.MaxValue) 

 // Return type is greater than maximum int value (4294967296)
(Int32.MaxValue).CompareTo(Int32.MinValue)
Run Code Online (Sandbox Code Playgroud)

因此,他们决定返回值范围比方法的返回类型“小”的类型的减法结果Int32该情况下方法的返回类型“小”的类型的减法结果。

最后,您可以从这里查看该方法在所有类型中的实现:

这是Int16实现

   public int CompareTo(Int16 value) {
            return m_value - value;
        }
Run Code Online (Sandbox Code Playgroud)

这是Int32实现:

public int CompareTo(int value) {
            // Need to use compare because subtraction will wrap
            // to positive for very large neg numbers, etc.
            if (m_value < value) return -1;
            if (m_value > value) return 1;
            return 0;
        }
Run Code Online (Sandbox Code Playgroud)

在最后:

但是,当然,将来他们可以更改该代码的实现,推荐的方法是始终将结果与 1、0 或 -1 进行比较,如 msdn 中所述。

小于零(此实例在排序顺序中位于其他实例之前。)
(此实例在排序顺序中与其他实例出现在相同位置。)
大于零(此实例在排序顺序中位于其他实例之后。)


Hen*_*man 4

我返回 +1 或 +1000 有什么区别吗?

不应该。但谨慎地说,最好是两方面都安全:

  • 总是返回 -1, 0, +1
  • 总是消费< 0> 0