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

Gui*_*ume 19 .net c# vb.net

为什么decimal不是原始类型?

Console.WriteLine(typeof(decimal).IsPrimitive);
Run Code Online (Sandbox Code Playgroud)

输出false.

它是一种基类型,它是语言规范的一部分,但不是原语.什么原始类型代表decimal框架中的一个?一个int例如具有场m_value型的int.A double有一个m_value类型的领域double.事实并非如此decimal.它似乎是由一堆ints 代表,但我不确定.

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

Ada*_*rth 22

虽然不是直接的答案,但文档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中不认为它是原始数据类型).

  • @Guillaume是的,我看到了这个链接,我认为它可能取决于"原始"的定义所在.在CLR中,它不是原始类型,但是如果仅考虑规范(CLR是实现),它似乎被描述为一个. (2认同)

Val*_*yev 10

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

维基百科说

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

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

  • 虽然我理解答案背后的想法,但是这可以在32位系统上的63位宽的"double"和"long"等类型上得到证明吗?我的观点是CLR可能不会考虑原语的这种定义. (3认同)

Ham*_*yed 6

考虑下面的例子,

     int i = 5;
    float f = 1.3f;
    decimal d = 10;
Run Code Online (Sandbox Code Playgroud)

如果你放置一个调试器并验证本机指令集,那就是

在此输入图像描述

正如您所看到的,int 、 float都是基本类型,需要单个指令来执行赋值操作,而decimal、string都是非基本类型,需要多个本机指令来执行此操作。