Почему CompareTo на коротких позициях реализовано таким образом? - PullRequest
5 голосов
/ 05 июля 2011

Рассмотрим следующий код:

namespace ConsoleApplication1 {
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(100.CompareTo(200)); // prints -1
            Console.WriteLine(((decimal)100).CompareTo((decimal)200)); // prints -1
            Console.WriteLine(((short)100).CompareTo((short)200)); // prints -100
            Console.WriteLine(((float)100).CompareTo((float)200)); // prints -1
            Console.ReadKey();
        }
    } 
}

У меня вопрос, есть ли какие-то конкретные причины, по которым метод CompareTo в Int16 возвращает значения, отличные от -1, 0 и 1?

ILSpy показывает, что он реализован таким образом

public int CompareTo(short value)
{
    return (int)(this - value);
}

тогда как метод внедряется в Int32 таким образом

public int CompareTo(int value)
{
    if (this < value)
    {
        return -1;
    }
    if (this > value)
    {
        return 1;
    }
    return 0;
}

Ответы [ 2 ]

13 голосов
/ 05 июля 2011

Разница в том, что для short нет вероятности переполнения результата.Например, short.MinValue - (short) 1 по-прежнему отрицателен, тогда как int.MinValue - 1 равен int.MaxValue.

Другими словами, конкретная причина заключается в том, что вы можете использовать ярлык с short (без каламбура)тогда как тот же самый ярлык не работает с int.Вы не должны определенно требовать IComparable<T>.CompareTo реализаций, чтобы возвращать -1, 0 или 1. Документация довольно ясна, что результат имеет смысл только с точки зрения отрицания, нуля илиположительны.

5 голосов
/ 05 июля 2011

Ну, в любом случае вы должны действительно проверять только знак , но по причинам: я предполагаю, что для int и т. Д. Существует риск переполнения / переноса (при обработке 2 чисел большой величины), чтоперевернул бы знак, означающий, что должен проверить операторы.

Я бы предпочел, чтобы он был последовательным, но, похоже, это не проблема.Скорее всего, оптимизация, которая нетипична, но в рамках документированного API.В частности, оптимизация short здесь не означает, что она получит массовое количество использования (я использую short, но не что-нибудь как столько же, сколько я int).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...