C # Comparer.Default <short>. Сравнение и Comparer.Default <byte>не возвращает -1, 0 или 1 - PullRequest
0 голосов
/ 05 октября 2018

В чем причина всех «числовых» сравнителей (таких как 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) например)

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

На основании комментариев в коде это последнее:

// Need to use compare because subtraction will wrap
// to positive for very large neg numbers, etc.

Например, скажем, у нас была та же реализация, что и short илиbyte для int:

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

Теперь в контракте IComparer говорится, что если результат Compare равен:

  • Меньше нуля, то x
  • Больше нуля, затем x> y;
  • Ноль, затем x == y;

Но, учитывая приведенную выше реализацию, если мыПередав достаточно большое отрицательное целое число в качестве первого аргумента, вычитание будет переполнено и перенесено в действительно большое положительное число:

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

То есть результат будет неверно указывать, что Int32.MinValue больше 1.

Учитывая, что IComparer определяется как:

public int Compare (T x, T y);

То есть тип результата - int, можно просто выполнить вычитание аргументов * 1038.* или byte, поскольку это никогда не приведет к переполнению результата int.

0 голосов
/ 05 октября 2018

Я думаю, вы поняли это правильно.Разница int не вписывается в int, но разница в байтах всегда.

Возвращаемое значение Compare указано только для значения знака.Таким образом, это правильная и полезная оптимизация производительности, которая возвращает разницу x и y для более мелких типов.

В случае, если вам интересно: другие языки не обязательно следуют модели знаков (< 0, 0, > 0) вообще.Некоторые, такие как Haskell, возвращают перечисление с тремя возможными значениями Less, Equal, Greater.Это чище, но медленнее.

...