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.OneDecimal.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

xz四舍五入到0.112.00 ,并要求您计算(y)。

所以你可能会认为y = 2.00 - 1.11 。 其实y等于0.88,但你会得到0.89 。 (有0.01的差异)。

取决于x和y的实际值,结果将在-0.01+0.01之间变化,并且在某些情况下,当处理一堆尾随1的情况时,可以检查尾随值是否等于Decimal.MinusOne / 100Decimal.One / 100Decimal.Zero / 100来修复它们。

这是我如何使用它们。