Decimal.One,Decimal.Zero,Decimal.MinusOne在.Net中的用途是什么?
简单的问题 – 为什么Decimaltypes定义这些常量? 何必?
我正在寻找为什么这是由语言定义的原因,而不是对编译器的可能用途或影响。 为什么把这个放在那里呢? 编译器可以像Decimal.Zero一样轻松地在线编译0m,所以我不会将其作为编译器快捷方式购买。
小澄清。 它们实际上是静态只读值而不是常量。 这在.Net中有明显的区别,因为常量值是由各种编译器内联的,因此不可能在编译的程序集中跟踪它们的使用情况。 静态只读值不会被复制,而是被引用。 这对您的问题是有利的,因为这意味着可以分析它们的使用。
如果使用reflection器并通过BCL挖掘,您会注意到MinusOne和Zero仅用于VB运行时。 它主要用于服务十进制和布尔值之间的转换。 为什么MinusOne巧合地使用在一个单独的线程就在今天( 链接 )
奇怪的是,如果你看一下Decimal.One值,你会发现它没有用到。
至于为什么他们明确界定……我怀疑有一个硬性和快速的原因。 似乎没有具体的performance,只有一点便利措施可以归因于他们的存在。 我的猜测是,他们在BCL的发展过程中被某人添加,以方便他们,而且从未被移除。
编辑
在@Paleta发表评论之后,再深入研究const
问题。 Decimal.One
的C#定义使用const
修饰符,但是它在IL级别以static readonly
方式发出。 C#编译器使用了一些技巧来使这个值与const
几乎没有区别(例如内联文字)。 这将显示在识别这个技巧的语言(VB.Net认识到这一点,但F#不)。
一些.NET语言不支持十进制作为数据types,在这种情况下写入Decimal.ONE而不是新的Decimal(1)会更方便(也更快)。
Java的BigInteger类也有ZERO和ONE,出于同样的原因。
我的意见是,他们在那里帮助避免幻数。
魔术数字基本上是在你的代码中的任何地方,你有一个漂浮的数字浮动。 例如:
int i = 32;
这是有问题的,因为没有人能说出为什么我要设置为32,或者32是什么意思,或者如果它应该是32。 这是神奇而神秘的。
以类似的方式,我会经常看到这样做的代码
int i = 0; int z = -1;
为什么他们被设置为0和-1? 这只是巧合? 他们的意思是什么? 谁知道?
虽然Decimal.One
, Decimal.Zero
等不会告诉你在你的应用程序的上下文中的值是什么(也许零意味着“失踪”等),它确实告诉你,价值是有意设置的,可能有一些意义。
虽然不完美,但这比不告诉你任何事情要好得多:-)
注意这不是为了优化。 观察这个C#代码:
public static Decimal d = 0M; public static Decimal dZero = Decimal.Zero;
当使用ildasm查看生成的字节码时,两个选项都会导致相同的 MSIL。 System.Decimal
是一个值types,所以Decimal.Zero
不仅仅是使用文字值的“最优”。
这3个值arghhh !!!
我想他们可能跟我所说的“ 1”有关
说你有这个公式:
(x)1.116666 +(y)=(z)2.00000
但x , z四舍五入到0.11和2.00 ,并要求您计算(y)。
所以你可能会认为y = 2.00 - 1.11
。 其实y等于0.88,但你会得到0.89 。 (有0.01的差异)。
取决于x和y的实际值,结果将在-0.01到+0.01之间变化,并且在某些情况下,当处理一堆尾随1的情况时,可以检查尾随值是否等于Decimal.MinusOne / 100
, Decimal.One / 100
或Decimal.Zero / 100
来修复它们。
这是我如何使用它们。