为什么decimal
不是原始类型?
Console.WriteLine(typeof(decimal).IsPrimitive);
输出false
。
它是一种基本类型,它是语言规范的一部分,但不是原语。什么原始类型代表框架中的decimal
?例如,int
的字段m_value
的类型为int
。 double
的字段m_value
的类型为double
。 decimal
并非如此。它似乎由一堆int
代表,但我不确定。
为什么它看起来像一个原始类型,behaves like a primitive type(couple of cases除外)但不是原始类型?
答案 0 :(得分:21)
虽然不是直接答案,但IsPrimitive
的文档列出了原始类型:
http://msdn.microsoft.com/en-us/library/system.type.isprimitive.aspx
这里也提出了类似的问题:
http://bytes.com/topic/c-sharp/answers/233001-typeof-decimal-isprimitive-false-bug-feature
Jon Skeet引用的答案:
CLR不需要有关于小数的任何内在知识 type - 它将它视为恰好具有的另一种值类型 重载运营商。没有IL指令可以直接操作 例如,在小数上。
对我来说,似乎decimal
是一种类型,对于希望符合CLS / CLI的语言/运行时必须存在(因此它被称为“原始”,因为它是带有关键字的基类型支持),但实际的实现并不要求它真正“原始”(因为在CLR中不认为它是原始数据类型)。
答案 1 :(得分:10)
Decimal是128位数据类型,无法在计算机硬件上本机表示。例如,64位计算机体系结构通常具有64位宽的整数和寻址寄存器,允许直接支持64位数据类型和地址。
维基百科说
取决于语言及其实现,原始数据类型 可能会也可能不会与对象中的对象进行一对一的对应 电脑的记忆。但是,人们通常希望基本操作 原始数据类型是最快的语言结构。
在十进制的情况下,它只是一种在内部使用整数的复合数据类型,因此其性能比与计算机内存(整数,双精度等)直接相关的数据类型要慢。
答案 2 :(得分:1)