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

为什么decimal不是原始类型?

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

输出false

它是一种基本类型,它是语言规范的一部分,但不是原语。 什么原始类型在框架中表示decimal ? 例如, int具有int类型的字段m_valuedouble有一个m_value类型的字段m_valuedecimal不是这种情况。 它似乎由一堆int表示,但我不确定。

为什么它看起来像一个原始类型, 表现得像一个原始类型 (除了在几种情况下 )但不是一个原始类型?

虽然不是直接的答案,但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不需要有关于十进制类型的任何内在知识 – 它将它视为另一个恰好具有重载运算符的值类型。 例如,没有IL指令直接在小数上操作。

对我来说,似乎decimal是一种必须存在的类型,它必须存在于希望符合CLS / CLI的语言/运行时(因此它被称为“原始”,因为它是一个带有关键字支持的基类型),但实际的实现不要求它真正“原始”(因为在CLR中不认为它是原始数据类型)。

Decimal是128位数据类型,无法在计算机硬件上本机表示。 例如,64位计算机体系结构通常具有64位宽的整数和寻址寄存器,允许直接支持64位数据类型和地址。

维基百科说

根据语言及其实现,原始数据类型可能与计算机内存中的对象一一对应,也可能不一致。 但是,人们通常希望对基本原始数据类型的操作是最快的语言结构。

在十进制的情况下,它只是一种在内部使用整数的复合数据类型,因此其性能比与计算机内存(整数,双精度等)直接相关的数据类型要慢。

考虑下面的例子,

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

如果您放置一个调试器并validation本机指令集,那就是

在此处输入图像描述

正如你可以看到intfloat all是一个原始类型需要单个指令来执行assignemnt操作而decimal,string是非原始类型需要多个本机指令来执行此操作。