Decimal.One,Decimal.Zero,Decimal.MinusOne在.Net中的用途是什么?

Jas*_*ine 64 .net c# vb.net constants decimal

简单的问题 - 为什么Decimal类型定义了这些常量?何必?

我正在寻找这个由语言定义的原因,而不是对编译器的可能用途或影响.为什么首先把它放在那里?编译器可以像在Decimal.Zero中一样轻松地在线0m,所以我不会将它作为编译器快捷方式购买.

Jar*_*Par 30

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

如果您使用反射器并通过BCL挖掘,您会注意到MinusOne和Zero仅用于VB运行时.它主要用于提供Decimal和Boolean值之间的转换.为什么MinusOne被巧合地用于今天的单独线程(链接)

奇怪的是,如果你看一下Decimal.One值,你会注意到它没有被使用.

至于为什么明确定义它们......我怀疑有一个硬性和快速的原因.有似乎是没有具体表现,只有一点是可以归因于他们的存在便利措施.我的猜测是,在BCL的开发过程中,他们是为了方便而添加的,并且从未删除过.

编辑

const在@Paleta发表评论之后再多探讨这个问题.C#定义Decimal.One使用const修饰符,但它static readonly在IL级别发出.C#编译器使用了一些技巧来使这个值几乎与a const(例如内联文字)无法区分.这将以一种识别这一技巧的语言出现(VB.Net认识到这一点,但F#没有).

  • 嗯,刚刚看到IL上声明为field static initonly,C#中的const都是翻译成static readonly字段吗?感谢您的澄清 (2认同)
  • @Paleta我和你一样有同样的困惑.我不得不坐下来几分钟,并使用生成的IL和C#源来了解这里发生了什么.但是,对于您的问题,大多数C#常量都不会以.literal值的形式发出.似乎只有`DateTime`和`Decimal`以这种混合方式发出 (2认同)

mih*_*ihi 19

某些.NET语言不支持十进制作为数据类型,在这些情况下编写Decimal.ONE而不是新的Decimal(1)更方便(也更快).

出于同样的原因,Java的BigInteger类也有ZERO和ONE.

  • 他可能意味着如果一种语言没有十进制文字,使用常量会比将int文字转换为十进制更有效.每种.NET语言都支持System.Decimal数据类型,它是CLR的一部分. (7认同)
  • 是的,尼基,这就是我想说的。当然,您可以在所有 .NET 语言中使用 System.Decimal,但有些语言支持得更好(例如 C#,它具有十进制关键字和十进制文字),有些则支持得更差。抱歉,英语不是我的母语... (2认同)