为什么十进制不是原始类型?

时间:2012-11-20 11:10:02

标签: c# .net vb.net

为什么decimal不是原始类型?

Console.WriteLine(typeof(decimal).IsPrimitive);

输出false

它是一种基本类型,它是语言规范的一部分,但不是原语。什么原始类型代表框架中的decimal?例如,int的字段m_value的类型为intdouble的字段m_value的类型为doubledecimal并非如此。它似乎由一堆int代表,但我不确定。

为什么它看起来像一个原始类型,behaves like a primitive typecouple of cases除外)但不是原始类型?

3 个答案:

答案 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)

考虑下面的例子,

     int i = 5;
    float f = 1.3f;
    decimal d = 10;

如果您放置调试器并验证本机指令集,则它将是

enter image description here

如您所见 int float 所有都是基本类型需要单个指令来执行assignemnt操作,而十进制,字符串是非原始类型需要多个本机指令才能执行此操作。