Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.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#规范将类型类称为简单类型,为什么类型类有一个名为IsPrimitive()的方法?_C#_Naming_Primitive Types_Language Specifications_Simpletype - Fatal编程技术网

如果C#规范将类型类称为简单类型,为什么类型类有一个名为IsPrimitive()的方法?

如果C#规范将类型类称为简单类型,为什么类型类有一个名为IsPrimitive()的方法?,c#,naming,primitive-types,language-specifications,simpletype,C#,Naming,Primitive Types,Language Specifications,Simpletype,查看C#6.0规范草案,我没有看到任何关于基本类型的内容;我只看到了有关的数据。也就是说,类型类有一个方法 “简单类型”是(按字母顺序)bool,byte,char,decimal,double,float,int,long,sbyte,short,,ulong和ushort。这是一组C#选择给予特殊状态的结构类型,具有其他类型无法获得的特殊规定(如标准中所详细说明的),例如将它们用作常量的能力 Type.IsPrimitive是一种不同的野兽;对于运行时认为在某种程度上特殊的一组有限的值类型(

查看C#6.0规范草案,我没有看到任何关于基本类型的内容;我只看到了有关的数据。也就是说,类型类有一个方法

“简单类型”是(按字母顺序)
bool
byte
char
decimal
double
float
int
long
sbyte
short
ulong
ushort
。这是一组C#选择给予特殊状态的结构类型,具有其他类型无法获得的特殊规定(如标准中所详细说明的),例如将它们用作常量的能力

Type.IsPrimitive
是一种不同的野兽;对于运行时认为在某种程度上特殊的一组有限的值类型(C#正式称之为“结构类型”,但C#开发人员通常称之为“值类型”),它返回
true
。这些类型是
Boolean
Byte
Char
Double
Int16
Int32
Int64
IntPtr
SByte
UInt16
UInt32
UInt64
uintpr。这些类型都有一个共同点,即它们作为内置类型直接受运行时支持,因此它们的操作是由JIT编译器直接实现的,而不是编译后的IL。(由于某种原因,还有一种值类型不符合这些标准:
TypedReference
。这在托管语言中很少使用,详细说明其用途和用途是另一种答案。)

这些列表之间最显著的区别是C#的简单类型
decimal
不是一种基本类型。这会产生一些后果:C#允许
十进制
常量,但运行时不允许——它们实际上被编译为
静态只读
字段,并带有一些属性魔法,如下所示。C#的设计者认为
decimal
非常重要,可以将其标记为简单类型,但它不是内置类型,因此编译器必须弥补这一差异

另一个重要的区别是,<>代码> ItpTrt/Cuff>和 UntPtR/Cuth>是内置类型,但是Cype不认为它们是“简单的”,大概是因为您不应该在互操作场景之外的托管代码中大量使用它们,也因为它们具有不被其他简单类型共享的限制。(您不能声明

IntPtr
常量,甚至不能在IL级别声明,因为实际大小因平台而异)


因此,简短的回答是:不,
Type.IsPrimitive
不应该被命名为
Type.IsSimple
,尽管“primitive Type”除了类型的原始列表之外,实际上没有一个我能看到的单一定义。“内置值类型”确实有一个定义,与
类型几乎但不完全相同。IsPrimitive
调用“primitive”。

这两个列表完全相同吗?提示-它们不是。不。“Simple Type”是一个C概念,“primitive Type”是一个CLR概念。
decimal
是C类型的一个示例#认为简单,但不是基元类型。@jeroemostert您不应该将此添加为答案吗?:)@mjwills它们不是。“谢谢你指出这一点。”我明白了,我想这是有道理的。你对CLR命名约定有什么好的参考吗?