Десятичное число.NET. Инвертируйте по сравнению с умножением на-1

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

9
задан abatishchev 5 August 2010 в 06:17
поделиться

4 ответа

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

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

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

17
ответ дан 4 December 2019 в 08:32
поделиться

Если вы посмотрите исходный код .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.

6
ответ дан 4 December 2019 в 08:32
поделиться

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

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

2
ответ дан 4 December 2019 в 08:32
поделиться

Из MSDN, decimal.Negate:

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

Практической разницы нет, хотя читабельность важна.

0
ответ дан 4 December 2019 в 08:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: