decimal.Negate(myDecimal)
和之间有什么区别myDecimal * -1
(除了可读性)?
问问题
2241 次
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,因为我喜欢避免幻数在我的代码中四处飘浮,虽然-1
as used 并没有真正的幻数,但乍一看它确实像一个幻数。
于 2010-08-05T06:22:38.963 回答
0
于 2010-08-05T06:18:46.630 回答