简单的问题-为什么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#不能).

.net相关问答推荐

从没有流的EventStore中读取流不存在异常

DotNet COM初始化问题

.NET Core 中的微服务

ECS服务无法从Cognito获取配置

在本地运行 Azure 函数会在 .NET7 升级后出现无运行时错误

即时窗口中的动态导致Microsoft.CSharp.RuntimeBinder.Binder未定义或导入错误

单线程单元 - 无法实例化 ActiveX 控件

为什么 .net 对字符串使用 UTF16 编码,但默认使用 UTF-8 来保存文件?

CurrentCulture、InvariantCulture、CurrentUICulture 和 InstalledUICulture 之间的区别

单击关闭按钮时隐藏表单而不是关闭

整个命名空间的SuppressMessage

为 XML 编码文本数据的最佳方法

异步总是 WaitingForActivation

返回 IQueryable 或不返回 IQueryable

托管和非托管代码、内存和大小有什么区别?

如何在不丢失数据的情况下重命名 Entity Framework 5 Code First 迁移中的数据库列?

如何从 .NET 中的流中获取 MemoryStream?

EF Core 添加迁移构建失败

如何从其十六进制 RGB 字符串创建 System.Drawing.Color?

从 'System.Int32' 到 'System.Nullable`1[[System.Int32, mscorlib]] 的无效转换