21

为什么decimal不是原始类型?

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

输出false

它是基本类型,是语言规范的一部分,但不是原始类型。decimal什么原始类型在框架中代表 a ?int例如,有一个类型m_value为的字段int。Adouble有一个m_value类型为 的字段double。情况并非如此decimal。它似乎由一堆ints 代表,但我不确定。

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

4

3 回答 3

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 中不认为它是原始数据类型)。

于 2012-11-20T11:13:33.720 回答
12

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

维基百科说

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

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

于 2012-11-20T11:22:14.673 回答
4

考虑下面的例子,

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

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

在此处输入图像描述

正如您所看到的int,作为原始类型的float都需要一条指令来执行分配操作,而作为非原始类型的十进制、字符串需要多条本机指令来执行此操作。

于 2018-01-06T11:43:50.553 回答