为什么 Type class 有一个名为 IsPrimitive() 的方法,如果 C# 规范将它们称为简单类型?
Why does the Type class have a method called IsPrimitive() if the C# spec refers to them as simple types?
查看 C# 6.0 草案规范,我没有看到任何有关原始类型的内容;我只看到了关于 Simple types. That said, the Type class has an IsPrimitive 方法的数据。
IsPrimitve 真的应该是 IsSimple 吗?
C# "simple types" 是(按字母顺序)bool
、byte
、char
、decimal
、double
、float
、int
、long
、sbyte
、short
、uint
、ulong
和ushort
。这些是 C# 选择赋予特殊地位的一组结构类型,具有其他类型没有的特殊规定(如标准中详述),例如将它们用作常量的能力。
Type.IsPrimitive
是另一种野兽;它 returns true
用于一组有限的值类型(C# 正式称为 "struct types",但 C# 开发人员通常将其称为 "value types"),运行时认为在某些情况下是特殊的方法。这些类型是 Boolean
、Byte
、Char
、Double
、Int16
、Int32
、Int64
、IntPtr
, SByte
, Single
, UInt16
, UInt32
, UInt64
和 UIntPtr
(都住在 System
)。这些类型都有一个共同点,即它们作为内置类型直接由运行时支持,因此它们具有由 JIT 编译器直接实现的操作,而不是作为已编译的 IL。 (由于某种原因,还有一种满足这些标准的值类型不在此类型列表中:TypedReference
。这在托管语言中很少使用,详细说明其目的和用途是另一个答案。)
这些列表之间最显着的区别是 C# 的简单类型 decimal
不是基本类型。这会产生一些后果:C# 允许 decimal
常量,但运行时不允许——它们实际上被编译为 static readonly
字段,具有一些魔法属性,如 detailed by Jon Skeet here。 C# 的设计者认为 decimal
重要到足以将其标记为简单类型,但它不是内置类型,因此编译器必须弥补差异。
另一个重要的区别是 IntPtr
和 UIntPtr
是内置类型,但 C# 不考虑它们 "simple",大概是因为你真的不应该在互操作场景之外的托管代码中大量使用它们,还因为它们具有其他简单类型无法共享的限制(您不能声明 IntPtr
常量,即使在 IL 级别也不行,因为实际大小因实际大小而异平台)。
所以简短的回答是:不,Type.IsPrimitive
不应该命名为 Type.IsSimple
,尽管 "primitive type" 除了原始列表之外,我并没有真正看到一个单一的定义的类型。 "Built-in value type" 确实有一个定义,它几乎但不完全与 Type.IsPrimitive
所称的 "primitive".
相同
查看 C# 6.0 草案规范,我没有看到任何有关原始类型的内容;我只看到了关于 Simple types. That said, the Type class has an IsPrimitive 方法的数据。
IsPrimitve 真的应该是 IsSimple 吗?
C# "simple types" 是(按字母顺序)bool
、byte
、char
、decimal
、double
、float
、int
、long
、sbyte
、short
、uint
、ulong
和ushort
。这些是 C# 选择赋予特殊地位的一组结构类型,具有其他类型没有的特殊规定(如标准中详述),例如将它们用作常量的能力。
Type.IsPrimitive
是另一种野兽;它 returns true
用于一组有限的值类型(C# 正式称为 "struct types",但 C# 开发人员通常将其称为 "value types"),运行时认为在某些情况下是特殊的方法。这些类型是 Boolean
、Byte
、Char
、Double
、Int16
、Int32
、Int64
、IntPtr
, SByte
, Single
, UInt16
, UInt32
, UInt64
和 UIntPtr
(都住在 System
)。这些类型都有一个共同点,即它们作为内置类型直接由运行时支持,因此它们具有由 JIT 编译器直接实现的操作,而不是作为已编译的 IL。 (由于某种原因,还有一种满足这些标准的值类型不在此类型列表中:TypedReference
。这在托管语言中很少使用,详细说明其目的和用途是另一个答案。)
这些列表之间最显着的区别是 C# 的简单类型 decimal
不是基本类型。这会产生一些后果:C# 允许 decimal
常量,但运行时不允许——它们实际上被编译为 static readonly
字段,具有一些魔法属性,如 detailed by Jon Skeet here。 C# 的设计者认为 decimal
重要到足以将其标记为简单类型,但它不是内置类型,因此编译器必须弥补差异。
另一个重要的区别是 IntPtr
和 UIntPtr
是内置类型,但 C# 不考虑它们 "simple",大概是因为你真的不应该在互操作场景之外的托管代码中大量使用它们,还因为它们具有其他简单类型无法共享的限制(您不能声明 IntPtr
常量,即使在 IL 级别也不行,因为实际大小因实际大小而异平台)。
所以简短的回答是:不,Type.IsPrimitive
不应该命名为 Type.IsSimple
,尽管 "primitive type" 除了原始列表之外,我并没有真正看到一个单一的定义的类型。 "Built-in value type" 确实有一个定义,它几乎但不完全与 Type.IsPrimitive
所称的 "primitive".