所有“数字”比较器(例如Comparer.Default<int>
,Comparer.Default<long>
等)返回-1
,0
或1
的原因是什么,但是Comparer.Default<short>
和Comparer.Default<byte>
会返回两个比较数字之间的差值?
这是否是一种优化功能(返回差异更快)和/或因为两个短裤或两个字节之间的可能差异将适合int
(返回类型Comparer<T>.Compare
)?但是两个ints
之间的区别不会(例如Comparer<T>.Compare(int.MinValue, int.MaxValue)
)
答案 0 :(得分:2)
基于comments in the code是后者:
// Need to use compare because subtraction will wrap // to positive for very large neg numbers, etc.
例如,假设我们具有与short
的{{1}}或byte
相同的实现:
int
现在,private int Compare(int x, int y)
{
return x - y;
}
合同规定如果IComparer
的结果为:
但是,在上述实现中,如果我们传递足够大的负整数作为第一个参数,则减法将溢出并包装为一个非常大的正数:
Compare
该结果将错误地指示Compare(Int32.MinValue, 1); // returns 2147483647
大于Int32.MinValue
。
鉴于1
被定义为:
IComparer
也就是说,结果类型为public int Compare (T x, T y);
,只对参数int
或short
进行减法是安全的,因为它永远不会导致byte
结果溢出。
答案 1 :(得分:0)
我认为您完全正确。整数差异不适合整数,但字节差异总是适用。
指定返回值Compare
仅与符号有关。因此,对于较小的类型返回x
和y
之差是一种有效且有用的性能优化。
如果您有兴趣:其他语言完全不必遵循符号模型(< 0
,0
,> 0
)。某些代码(例如Haskell)返回具有三个可能值Less, Equal, Greater
的枚举。这更干净但是更慢。