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

标签 c# naming primitive-types language-specifications simpletype

查看 C# 6.0 草案规范时,我没有看到任何有关原始类型的内容;我只看到关于 Simple types 的数据.也就是说,Type 类有一个 IsPrimitive方法。

IsPrimitve 真的应该是 IsSimple 吗?

最佳答案

C#“简单类型”是(按字母顺序)boolbytechardecimaldoublefloatintlongsbyteshort code>、uintulongushort。这些是 C# 选择赋予特殊状态的一组结构类型,具有其他类型无法获得的特殊规定(如标准中所述),例如将它们用作常量的能力。

Type.IsPrimitive 是另一种野兽;它为一组有限的值类型(C# 正式称为“结构类型”,但无论如何 C# 开发人员通常称为“值类型”)返回 true ,运行时认为这些类型在某种程度上是特殊的。这些类型是BooleanByteCharDoubleInt16Int32, Int64, IntPtr, SByte, Single, UInt16 >、UInt32UInt64UIntPtr(都存在于 System 中)。这些类型都有一个共同点,即它们作为内置类型直接由运行时支持,因此它们具有由 JIT 编译器直接实现的操作,而不是作为已编译的 IL。 (出于某种原因,还有一种满足这些标准但不在此类型列表中的值类型:TypedReference。这在托管语言中很少使用,详细说明其目的和用途是另一回事答案。)

这些列表之间最显着的区别是 C# 的简单类型 decimal 不是基本类型。这会产生一些后果:C# 允许 decimal 常量,但运行时不允许 - 它们实际上被编译为具有某些魔法属性的 static readonly 字段,如 detailed by Jon Skeet here . C# 的设计者认为 decimal 足够重要,可以将其标记为简单类型,但它不是内置类型,因此编译器必须弥补差异。

另一个重要的区别是 IntPtrUIntPtr 是内置类型,但 C# 并不认为它们是“简单的”,大概是因为你真的不认为在互操作场景之外的托管代码中大量使用它们,还因为它们具有其他简单类型无法共享的限制(您不能声明 IntPtr 常量,甚至不能在 IL 级别,因为实际大小因平台而异)。

所以简短的回答是:不,Type.IsPrimitive 不应该命名为 Type.IsSimple,尽管“原始类型”并没有真正的单一定义可以看到,超出了类型的原始列表。 “内置值类型”确实有一个定义,它与 Type.IsPrimitive 所说的“原始”几乎但不完全相同。

关于c# - 如果 C# 规范将它们称为简单类型,为什么 Type 类有一个名为 IsPrimitive() 的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57395691/

相关文章:

c# - #if 调试 --> #if myOwnConfig?

c# - 在 ADO.Net 实体模型中,如何将带有外键的表更新为另一个表?

Android xml id命名

java - hibernate 异常 : Missing column: Wrong name

java - 最高效的 Java 原始集合库

c# - 循环依赖

c# - 需要更快地实现 Image.FromStream 以实时显示图像

java - Java 方法名称的有效字符是什么?

java - 方法调用中的 Null、原始数据值和包装类

java - 常规编程: How do you return two Types of primitive ('int and ' string') from "get" method?