.NET decimal.Negate vs乘以-1

anc*_*dra 9 .net c# decimal negate

decimal.Negate(myDecimal)myDecimal * -1(除了可读性)之间是否有任何差异?

Jon*_*eet 17

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

因此,与其进行比较myDecimal * -1可能有助于将其视为另一种写作方式-myDecimal.

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


ata*_*man 6

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

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

由于十进制内部的工作方式,看起来这是一种奇特的说法-1.

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

FCallMultiply(ref result, yourNumber, -1M);
Run Code Online (Sandbox Code Playgroud)

这可能会产生不同的IL代码.