Есть ли любые различия между decimal.Negate(myDecimal)
и myDecimal * -1
(кроме, возможно, удобочитаемости)?
Я подозреваю, что Negate
существует, потому что есть унарный оператор минус ( op_UnaryNegation
), и рекомендуется иметь методы, представляющие эквивалентную функциональность, чтобы языки которые не поддерживают перегрузку оператора, могут по-прежнему достичь того же результата.
Поэтому вместо того, чтобы сравнивать его с myDecimal * -1
, может быть полезно подумать об этом как об альтернативном способе записи -myDecimal
.
(Я считаю, что он также оптимизирован - учитывая способ работы с плавающей запятой, отрицание значения намного проще, чем обычное умножение; нужно только немного перевернуть. Нет необходимости выполнять какие-либо фактические арифметические действия.)
Если вы посмотрите исходный код .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.
Лично я считаю -myDecimal
более читабельным, чем любой из них (я не математик, но уверен, что все три эквивалентны), но опять же, я обычно предпочитаю компактные обозначения.
Если это не так, я бы выбрал Negate, так как мне нравится избегать плавающих в моем коде магических чисел, и хотя -1
в том виде, в каком он используется, на самом деле это не магическое число, оно конечно, на первый взгляд выглядит так.
Из MSDN, decimal.Negate
:
Возвращает результат умножения указанного десятичного значения на отрицательную единицу.
Практической разницы нет, хотя читабельность важна.