"Decimal.One", "Decimal.Zero"和"Decimal.MinusOne"在.Net中的作用是什么?

15 浏览
0 Comments

"Decimal.One", "Decimal.Zero"和"Decimal.MinusOne"在.Net中的作用是什么?

简单的问题——为什么十进制类型要定义这些常量? 为什么要费心呢?

我正在寻找这个由语言定义的原因,而不是可能的用途或编译器的影响。为什么一开始要放进去呢?编译器可以像Decimal.Zero一样轻松地内联0m,所以我不认为这是编译器的捷径。

admin 更改状态以发布 2023年5月21日
0
0 Comments

一些.NET语言不支持十进制字面量,在这种情况下,写Decimal.ONE比new Decimal(1)更方便(也更快)。\nJava的BigInteger类也有ZERO和ONE,原因相同。

0
0 Comments

小小的澄清。它们实际上是静态只读值而不是常量。在.Net中,这有着明显的区别,因为各种编译器会内联常量值,因此在编译后的程序集中无法跟踪其使用情况。然而,静态只读值是不会被复制而是被引用的。对于您的问题来说,这是有利的,因为它意味着可以分析它们的使用情况。

如果您使用反射器并深入BCL,您会注意到MinusOne和Zero只与VB运行时一起使用。它主要存在于Decimal和Boolean值之间的转换中。为什么使用MinusOne恰好在另一个线程上讨论(链接)

令人奇怪的是,如果您查看Decimal.One的值,您会注意到它现在没有被使用。

至于为什么它们被明确定义......我怀疑没有一个硬性的原因。它们的存在只能归因于一点方便措施,而不是任何特定的性能优势。我的猜测是它们是由开发BCL的人之一为了他们自己的方便而添加的,然后就从未删除。

编辑

在@Paleta的评论后,进一步深入了解了const问题。C#定义 Decimal.One 使用 const 修饰符,但在IL级别上它被发射为 static readonly 。 C#编译器使用了一些技巧,使这个值在实质上与 const 难以区分(例如内联文字)。这将在识别此技巧的语言中出现(VB.Net识别此技巧,但F#不识别)。

0