一个简单的问题-为什么Decimal类型定义这些常量?何必呢?
我正在寻找为什么这是由语言定义的原因,而不是对编译器的可能用途或影响。为什么首先要放在这里?编译器可以像Decimal.Zero一样轻松地插入0m,因此我不打算将其作为编译器快捷方式购买。
一个简单的问题-为什么Decimal类型定义这些常量?何必呢?
我正在寻找为什么这是由语言定义的原因,而不是对编译器的可能用途或影响。为什么首先要放在这里?编译器可以像Decimal.Zero一样轻松地插入0m,因此我不打算将其作为编译器快捷方式购买。
Answers:
小澄清。它们实际上是静态只读值,而不是常量。.Net有一个明显的区别,因为常量值由各种编译器内联,因此无法在编译的程序集中跟踪其用法。但是,静态只读值不会被复制,而是被引用。这对您的问题很有用,因为这意味着可以分析它们的使用。
如果使用反射器并通过BCL进行挖掘,则会注意到MinusOne和Zero仅在VB运行时中使用。它主要用于提供十进制和布尔值之间的转换。为什么今天刚巧使用MinusOne出现在单独的线程上(链接)
奇怪的是,如果您查看Decimal.One值,您会发现它无处使用。
至于为什么要对它们进行明确定义……我怀疑有一个坚定而快速的理由。有似乎是没有具体表现,只有一点是可以归因于他们的存在便利措施。我的猜测是,为了方便起见,它们是在BCL的开发过程中由某人添加的,并且从未删除过。
编辑
const
@Paleta发表评论后,进一步探讨了这个问题。C#定义Decimal.One
使用const
修饰符,但是static readonly
在IL级别将其作为a发出。C#编译器使用一些技巧来使该值与a几乎没有区别const
(例如,内联文字)。这将以识别该技巧的语言显示(VB.Net识别出此技巧,但F#不能识别)。
readonly
。我已经通过查看元数据和MSDN页面中的hte值来验证了这一点。 msdn.microsoft.com/zh-CN/library/system.decimal.one(VS.80).aspx
DateTime
和Decimal
在该混合方式发射
某些.NET语言不支持十进制文字,在这种情况下,编写Decimal.ONE而不是新的Decimal(1)更加方便(并且更快)。
出于相同的原因,Java的BigInteger类也具有ZERO和ONE。
我对此的看法是,它们在那里可以避免出现幻数。
幻数基本上是代码中随处可见的数字。例如:
int i = 32;
从没有人知道我为什么设置为32或32表示什么,或者根本不应该是32的意义上说,这是有问题的。这是神奇而神秘的。
同样,我经常会看到执行此操作的代码
int i = 0;
int z = -1;
为什么将它们设置为0和-1?这只是巧合吗?他们是什么意思吗?谁知道?
尽管Decimal.One
,,Decimal.Zero
等不会告诉您值在应用程序上下文中的含义(可能为零表示“丢失”等),但确实会告诉您该值已被故意设置,并且可能具有某些含义。
虽然并不完美,但这总比不告诉你任何东西要好得多:-)
注意 这不是为了优化。遵守以下C#代码:
public static Decimal d = 0M;
public static Decimal dZero = Decimal.Zero;
使用ildasm查看生成的字节码时,两个选项都将导致相同的MSIL。System.Decimal
是一个值类型,因此Decimal.Zero
没有比仅使用文字值更“最优”的了。
那三个值啊!
我认为他们可能与我称之为尾随1的东西有关
说你有这个公式:
(x)1.116666 +(y)=(z)2.00000
但是x,z会四舍五入为0.11和2.00,并且要求您计算(y)。
所以你可能会想y = 2.00 - 1.11
。实际上y等于0.88,但您将获得0.89。(相差0.01)。
主要依靠X的真正价值和y将改变从结果-0.01至+0.01,在某些情况下与一群那些尾随的1的交易时,并facilate东西,你可以检查是否尾随值等于Decimal.MinusOne / 100
,Decimal.One / 100
或Decimal.Zero / 100
修复它们。
这就是我利用它们的方式。