.NET decimal.Negate против умножения на -1 - PullRequest
9 голосов
/ 05 августа 2010

Есть ли различия между decimal.Negate(myDecimal) и myDecimal * -1 (кроме, возможно, читабельности)?

Ответы [ 4 ]

17 голосов
/ 05 августа 2010

Я подозреваю, что Negate существует, потому что есть унарный оператор минус (op_UnaryNegation), и рекомендуется использовать методы, представляющие эквивалентную функциональность, чтобы языки, которые не поддерживают перегрузку операторов, могли по-прежнемудостичь того же результата.

Так что вместо сравнения с myDecimal * -1 может быть полезно думать об этом как об альтернативном способе написания -myDecimal.

(я считаю, что это такжеОптимизировано - учитывая способ работы с плавающей запятой, отрицание значения намного проще, чем обычное умножение, нужно только немного перевернуть. Нет необходимости выполнять какую-либо действительную арифметику.)

6 голосов
/ 05 августа 2010

Если вы посмотрите на источник .NET с помощью .NET Reflector, вы увидите следующее: (получая кофе, пока он наконец не откроется ..)

public static decimal Negate(decimal d)
{
    return new decimal(d.lo, d.mid, d.hi, d.flags ^ -2147483648);
}

Похоже, это причудливый способ сказать -1 из-за того, как работает десятичная дробь внутри.

Если вы сделаете * -1, он отобразит его на следующий вызов:

FCallMultiply(ref result, yourNumber, -1M);

, который, скорее всего, даст другой код IL.

2 голосов
/ 05 августа 2010

Лично я нахожу -myDecimal более читабельным, чем любой из них (я не математик, но я почти уверен, что все три эквивалентны), но опять же, я обычно предпочитаю компактную запись.

Если это не так, я бы пошел с Negate, так как я хотел бы избежать магических чисел, плавающих в моем коде, и хотя -1, как он используется, на самом деле не является магическим числом, оно, несомненно, выглядит первый взгляд.

0 голосов
/ 05 августа 2010

Из MSDN, decimal.Negate:

Возвращает результат умножения указанного десятичного значения на отрицательное.

Нет практической разницытогда, хотя удобочитаемость важна.

...