decimal.Negate(myDecimal)
和myDecimal * -1
之间是否存在差异(可读性除外)?
答案 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)