这些实现细节是为了性能。请注意,CompareTo 必须只返回 negative、positive 或 zero 值,例如 -123、456、0;没必要-1、1、0。
现在让我们看看实现。对于Short(和Byte),我们可以减去,这就足够了:
// Pseudocode
CompareTo() => a - b;
例如
(short)456 - (short)123 == 333 > 0 // so 456 > 123
(byte)5 - (byte)7 == -2 < 0 // so 5 < 7
发生了什么事?对于short 类型,值在[short.MinValue..short.MaxValue] 范围内,即[-32768..32767];当我们减去这些值时,它们将被 cast 转换为 int。请注意,我们保证不会出现整数溢出:
-32768 - 32767 == -65535 // min possible value, which is > int.MinValue
32767 - -32768 == 65535 // max possible value, which is < int.MaxValue
当我们有int 或long 进行比较时,我们不能只是减去;这是一个反例:
int.MinValue - 1 == some positive number! It means that MinValue > 1
我们必须比较
// Pseudocode
CompareTo() =>
a == b ? 0
: a < b ? - 1
: 1;