簡體   English   中英

C#Comparer.Default <short> 。比較和Comparer.Default <byte> 不返回-1,0或1

[英]C# Comparer.Default<short>.Compare and Comparer.Default<byte> doesn't return -1, 0 or 1

什么是后面的所有“數字” comparers的原因(如Comparer.Default<int>Comparer.Default<long>等)或者返回-101 ,但Comparer.Default<short>Comparer.Default<byte>將返回兩個比較數字之間的差異?

它是一個優化功能(返回差異更快)和/或因為兩個短路或兩個字節之間的可能差異將適合intComparer<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具有與shortbyte相同的實現:

private int Compare(int x, int y)
{
   return x - y;
}

現在, IComparer合同規定,如果Compare的結果是:

  • 小於零,則x <y;
  • 大於零,則x> y;
  • 零,然后x == y;

但是,鑒於上面的實現,如果我們傳遞一個足夠大的負整數作為第一個參數,減法將溢出並包裹到一個非常大的正數:

Compare(Int32.MinValue, 1); // returns 2147483647

這是結果將錯誤地指示Int32.MinValue大於1

鑒於IComparer定義為:

public int Compare (T x, T y);

也就是說,結果類型是一個int ,只需執行shortbyte參數的減法是安全的,因為它永遠不會導致int結果溢出。

我認為你完全正確。 int差異不適合int,但字節差異總是如此。

Compare的返回值僅指定與符號有關。 因此,對於較小的類型,返回xy的差異是有效且有用的性能優化。

如果您感興趣:其他語言根本不一定遵循符號模型( < 0 0> 0 )。 一些(如Haskell)返回一個枚舉,其中包含三個可能的值Less, Equal, Greater 這更干凈但更慢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM