[英]C# Comparer.Default<short>.Compare and Comparer.Default<byte> doesn't return -1, 0 or 1
什么是后面的所有“數字” comparers的原因(如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)
)
// Need to use compare because subtraction will wrap // to positive for very large neg numbers, etc.
例如,假設我們對int
具有與short
或byte
相同的實現:
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
參數的減法是安全的,因為它永遠不會導致int
結果溢出。
我認為你完全正確。 int差異不適合int,但字節差異總是如此。
Compare
的返回值僅指定與符號有關。 因此,對於較小的類型,返回x
和y
的差異是有效且有用的性能優化。
如果您感興趣:其他語言根本不一定遵循符號模型( < 0
0
, > 0
)。 一些(如Haskell)返回一個枚舉,其中包含三個可能的值Less, Equal, Greater
。 這更干凈但更慢。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.