Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么decimal不是基本类型?_C#_.net_Vb.net - Fatal编程技术网

C# 为什么decimal不是基本类型?

C# 为什么decimal不是基本类型?,c#,.net,vb.net,C#,.net,Vb.net,为什么decimal不是基本类型 Console.WriteLine(typeof(decimal).IsPrimitive); 输出false 它是一个基类型,是语言规范的一部分,但不是原语。在框架中,哪些基元类型表示十进制?例如,int具有类型为int的字段m_值。double具有类型为double的字段m_值。对于十进制,情况并非如此。它似乎由一堆ints表示,但我不确定 为什么它看起来像基元类型(a中除外),但不是基元类型?虽然不是直接的答案,但IsPrimitive的文档列出了基元类

为什么
decimal
不是基本类型

Console.WriteLine(typeof(decimal).IsPrimitive);
输出
false

它是一个基类型,是语言规范的一部分,但不是原语。在框架中,哪些基元类型表示十进制?例如,
int
具有类型为
int
的字段
m_值
double
具有类型为
double
的字段
m_值
。对于
十进制
,情况并非如此。它似乎由一堆
int
s表示,但我不确定


为什么它看起来像基元类型(a中除外),但不是基元类型?

虽然不是直接的答案,但
IsPrimitive
的文档列出了基元类型:

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

这里提出了一个类似的问题:

引用Jon Skeet的回答:

CLR不需要任何关于十进制的内在知识 类型-它将其视为另一个碰巧具有 重载运算符。没有可直接操作的IL指令 比如说小数


在我看来,
decimal
似乎是一种语言/运行时必须存在的类型,以符合CLS/CLI(因此被称为“primitive”,因为它是一种具有关键字支持的基本类型),但实际实现并不要求它是真正的“primitive”(因为CLR不认为它是一种primitive数据类型).

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

维基百科说

根据语言及其实现,基本数据类型 可能与中的对象有一对一的对应关系,也可能没有 计算机的内存。然而,人们通常期望操作是基于基本的 基本数据类型是最快的语言结构


对于decimal,它只是一个内部使用整数的复合数据类型,因此其性能比与计算机内存直接相关的数据类型(整数、双精度等)要慢

考虑下面的例子

     int i = 5;
    float f = 1.3f;
    decimal d = 10;
如果放置调试器并验证本机指令集,则


如您所见,intfloat作为一个基本类型需要一条指令来执行assignemnt操作,而decimal,string作为非基本类型需要多条本机指令来执行此操作。

是的,我阅读了此链接。我给出的第一个链接——虽然是VB的链接——将
decimal
列为一个原语。在VB中尝试我的代码片段时,也返回了
false
。也许VB的规格有错误(或者它们已经过时了…)@纪尧姆:是的,我看到了这种联系,我想这可能取决于“原始”的定义。在CLR中,它不是一个原始类型,但是如果您只考虑规范(CLR是一个实现),它似乎被描述为一个。我认为混淆可能在术语中;正如在中一样,框架原语类型是一回事,而.NET支持的语言的“内置”类型是另一回事,但在该语言的上下文中被认为是不同意义上的“原语”?@GrantThomas我同意,这也是我最好的猜测,我希望能在回答中传达这一点。更有趣的例子是
string
,它应该被视为一个基本类型,因为它和
数组
是仅有的两种可变大小类型,并且它的存储不同于
数组
。我没有考虑此数据结构对体系结构的影响。。。我会尝试找到更多关于这方面的信息。虽然我理解答案背后的想法,但在32位系统上63位宽的
double
long
等类型上是否可以证明这一点?我的观点是,CLR可能没有考虑到原语的这个定义。因此,当我们在十年后拥有128位计算机时,基本上小数也可以成为原语。