简单的问题-为什么Decimal类型定义这些常量?何必费心呢?
我在寻找一个原因,为什么这是由语言定义的,而不是对编译器可能的使用或影响.为什么要把这个放在那里?编译器可以像使用十进制一样轻松地进行行内编译.零,所以我不买它作为编译器的捷径.
简单的问题-为什么Decimal类型定义这些常量?何必费心呢?
我在寻找一个原因,为什么这是由语言定义的,而不是对编译器可能的使用或影响.为什么要把这个放在那里?编译器可以像使用十进制一样轻松地进行行内编译.零,所以我不买它作为编译器的捷径.
小小的澄清.它们实际上是静电只读值,而不是常量.这在.Net中有明显的不同,因为不同编译器的常量值都是inlined,因此不可能跟踪它们在编译后的程序集中的使用情况.但是,静电只读值不会被复制,而是会被引用.这对您的问题是有利的,因为这意味着可以分析它们的使用情况.
如果使用reflector并深入研究BCL,您会注意到,只有在VB运行时,才会使用MinusOne和Zero.它主要用于十进制和布尔值之间的转换.为什么巧用了MinusOne今天在另一个线程中出现(link)
奇怪的是,如果你看小数点.有一个值你会注意到它在任何地方都没有使用.
至于为什么它们被明确定义...我怀疑这其中是否有确切的原因.没有具体的表现,只有一点可以归因于它们的存在的便利性.我的guess点是,它们是在BCL的开发过程中为方便而添加的,只是从未删除.
EDIT
在@Paleta发表 comments 后,我更深入地研究了const
问题.Decimal.One
的C#定义使用const
修饰符,但是它在IL级别作为static readonly
发出.C#编译器使用了几个技巧来使这个值与const
(例如内联文字)几乎没有区别.这将在能够识别此技巧的语言中显示出来(VB.Net可以识别这一点,但F#不能).