10

decimal.Negate(myDecimal)和之间有什么区别myDecimal * -1(除了可读性)?

4

4 回答 4

18

我怀疑Negate存在,因为有一个一元减号运算符 ( op_UnaryNegation),并且具有表示等效功能的方法是一种很好的做法,这样不支持运算符重载的语言仍然可以实现相同的结果。

因此,与其将其与myDecimal * -1它进行比较,不如将其视为另一种写作方式可能会有所帮助-myDecimal

(我相信它也经过优化 - 考虑到浮点的工作方式,取反比普通乘法简单得多;只需翻转一点。无需执行任何实际算术。)

于 2010-08-05T06:24:26.380 回答
7

如果您使用 .NET Reflector 查看 .NET 源代码,您将看到以下内容:( 喝咖啡直到它最终打开......)

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 代码。

于 2010-08-05T06:33:34.953 回答
2

就个人而言,我发现-myDecimal它比任何一个都更具可读性(我不是数学极客,但我很确定这三个都是等价的),但话又说回来,我通常更喜欢紧凑的符号。

如果出现这种情况,我会选择 Negate,因为我喜欢避免幻数在我的代码中四处飘浮,虽然-1as used 并没有真正的幻数,但乍一看它确实像一个幻数。

于 2010-08-05T06:22:38.963 回答
0

来自 MSDN decimal.Negate,:

返回指定的 Decimal 值乘以负一的结果。

没有实际区别,尽管可读性很重要。

于 2010-08-05T06:18:46.630 回答