.NET decimal.Negate vs乘以-1

时间:2010-08-05 06:15:49

标签: c# .net decimal negate

decimal.Negate(myDecimal)myDecimal * -1之间是否存在差异(可读性除外)?

4 个答案:

答案 0 :(得分:17)

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

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

(我相信它也是优化的 - 考虑到浮点的工作方式,否定一个值比正常的乘法简单得多;只需要翻转一点。不需要执行任何实际算术。)

答案 1 :(得分:6)

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

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

由于十进制内部的工作方式,这看起来很奇怪。

如果你执行* -1,它会将其映射到以下调用:

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

可能产生不同的IL代码。

答案 2 :(得分:2)

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

如果出现这种情况,我会选择Negate,因为我希望避免在我的代码中浮动魔术数字,虽然使用的-1并不是真正的神奇数字,但它确实看起来像乍一看。

答案 3 :(得分:0)

来自MSDN,decimal.Negate

  

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

然而,虽然可读性很重要,但没有实际意义。