除了可读性之外,
decimal.Negate(myDecimal)
和myDecimal * -1
之间有没有任何区别?我怀疑 Negate
的存在是因为有一元负操作符 (op_UnaryNegation
),而拥有代表相同功能的方法是一个好习惯,这样不支持运算符重载的语言仍然可以实现相同的结果。
因此,与其将其与 myDecimal * -1
进行比较,可能更有帮助的是将其视为编写 -myDecimal
的另一种方式。
(我相信它也被优化了——由于浮点数的工作方式,取反一个值要比普通乘法简单得多;只需要翻转一位。不需要执行任何实际的算术操作。)
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代码。
个人而言,我认为-myDecimal
比其他两种写法更易读(我不是数学专家,但我相信这三种写法是等价的),但话说回来,我通常更喜欢紧凑的符号表示。
如果不选-myDecimal
,我会选择Negate,因为我喜欢避免代码中出现神秘数字,虽然那里使用的-1
并不是真正的神秘数字,但乍一看确实像一个。
return new decimal(d.lo, d.mid, d.hi, d.flags ^ -2147483648);
。我怀疑这是否与myDecimal * -1
或-myDecimal
生成的IL相同。 - Jonathan Rupp