C# 在.Net中,Decimal.1,Decimal.Zero,Decimal.MinusOne的用途是什么

C# 在.Net中,Decimal.1,Decimal.Zero,Decimal.MinusOne的用途是什么,c#,.net,vb.net,decimal,constants,C#,.net,Vb.net,Decimal,Constants,简单的问题-为什么Decimal类型定义这些常量?为什么要麻烦 我正在寻找一个原因,为什么这是由语言定义的,而不是对编译器可能的使用或影响。为什么一开始就把这个放在那里?编译器可以像十进制.Zero一样轻松地插入0m,因此我不会把它作为编译器的快捷方式。我的观点是它们可以帮助避免出现幻数 幻数基本上是代码中任意一个浮动着幻数的地方。例如: int i = 32; 这是有问题的,因为没有人能告诉我为什么设置为32,或者32意味着什么,或者它是否应该是32。它既神奇又神秘 类似地,我经常会看到这样

简单的问题-为什么Decimal类型定义这些常量?为什么要麻烦

我正在寻找一个原因,为什么这是由语言定义的,而不是对编译器可能的使用或影响。为什么一开始就把这个放在那里?编译器可以像十进制.Zero一样轻松地插入0m,因此我不会把它作为编译器的快捷方式。

我的观点是它们可以帮助避免出现幻数

幻数基本上是代码中任意一个浮动着幻数的地方。例如:

int i = 32;
这是有问题的,因为没有人能告诉我为什么设置为32,或者32意味着什么,或者它是否应该是32。它既神奇又神秘

类似地,我经常会看到这样做的代码

int i = 0;
int z = -1;
为什么要将它们设置为0和-1?这只是巧合吗?它们有什么意义吗?谁知道呢

虽然
Decimal.One
Decimal.Zero
等没有告诉您这些值在应用程序上下文中的含义(可能零表示“缺少”,等等),但它确实告诉您该值是故意设置的,并且可能具有某种意义

虽然不完美,但这比什么都不告诉你要好得多:-)

注 这不是为了优化。遵守此C#代码:


当使用ildasm查看生成的字节码时,两个选项都会产生相同的MSIL
System.Decimal
是一种值类型,因此
Decimal.Zero
并不比仅使用文字值更“优化”。

某些.NET语言不支持十进制文字,在这些情况下,编写Decimal.ONE而不是新的十进制(1)更方便(更快)


出于同样的原因,Java的BigInteger类也有0和1。它们实际上是静态只读值,而不是常量。这在.Net中有一个明显的区别,因为常量值是由各种编译器内联的,因此不可能跟踪它们在已编译程序集中的使用情况。但是,静态只读值不会被复制,而是被引用。这对你的问题是有利的,因为这意味着可以分析它们的使用

如果您使用reflector并深入研究BCL,您会注意到只有在VB运行时才会使用MinusOne和Zero。它主要用于十进制和布尔值之间的转换。为什么要使用MinusOne,今天正好在另一个线程中出现()

奇怪的是,如果你看一下小数点,你会注意到一个值在任何地方都没有使用

至于为什么它们被明确定义。。。我怀疑是否有一个硬性的理由。似乎没有具体的表现,只有一点可归因于其存在的便利性。我的猜测是,它们是在BCL的开发过程中为方便而添加的,只是从未删除过

编辑


在@Paleta的评论之后,深入研究了
const
问题。
Decimal的C#定义。One
使用
const
修饰符,但它在IL级别作为
静态只读
发出。C#编译器使用了一些技巧,使该值实际上与
常量
无法区分(例如,内联文字)。这将出现在一种能够识别这一技巧的语言中(VB.Net能够识别这一点,但F#不能)

这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/100
Decimal.One/100
Decimal.Zero/100
来修复它们


我就是这样利用它们的。

你的论点伤了我的头。它们是数字,只有当你开始给它们附加随机意义时,它们才会变成神奇的数字,比如-1表示洗碗,1表示烤蛋糕。Decimal.One与1一样神奇,但可以说更难阅读(但可能更为理想)。我的观点是,如果有人键入Decimal.Zero,他们更有可能故意这么做,因为Zero具有某种意义——而不是随意将其设置为0。我反对说,将某些内容指定给0是任意的。这对于将符号常量映射到数字的枚举是有意义的,但对于映射到数字的数字来说似乎非常疯狂。有时候0真的是。。。零。另一方面,单位将是一个很好的构造。1公里!=1.说十进制.0就像说0.0一样随意。如果我们谈论的是在操作系统级别上发生变化的东西,比如“/”与描述文件系统分隔符的某个库常量,这是有意义的,但是Decimal.Zero始终只是0.0。该死,这只是我的观点。我想我已经说清楚了:-(有人能给我解释一下吗?6次赞成票意味着这一定是一个很好的答案-但是:一个不支持decimal作为数据类型的.Net语言如何从一个共享只读属性中获益,该属性返回一个十进制数,并被定义为decimal类的一部分?他可能是指,如果一种语言没有十进制数,那么使用constant将比将整型文字转换为dec更有效
public static Decimal d = 0M;
public static Decimal dZero = Decimal.Zero;