C# 原始数据类型是该语言的一部分吗?

Are C# primitive data types part of the language?

在 C++ 中,编译器 知道 原始数据类型,例如 int,但在 C# 中,这些基本上是结构(例如 System.Int32)。但是我可以假设 C# 知道 这些类型吗?我认为确实如此,因为 C# 中的 int 文字基本上是 System.Int32 的一个实例。例如,这将起作用:

Console.WriteLine((12345).GetType());

输出:

System.Int32

当然,像 intbool 这样的类型名称在 C# 语言中是 keywords。 A 属性 它与许多语言共享,包括 C++。它们当前映射到您已知的 .NET Framework 中的类型。不要错误地假设 System.Int32 是一个 struct,这肯定不是它在处理器上的使用方式。它是一种很容易适合处理器寄存器的类型,对于使程序 运行 快速运行非常重要。您可以看到的结构声明仅代表 boxed int。用于创建所有类型甚至值类型都派生自 System.Object.

的错觉

一种语言硬烘焙到物理处理器类型的映射只会带来风险。处理器变化迅速。典型的例子是 C 语言,C# 的祖父,已经 43 岁了,并且在软件开发方面仍然非常相关。在具有 64 KB 内存的 16 位计算机上启动。紧随其后的是稳定性孤岛,32 位设计存在了很长时间,能够寻址 4 GB 内存。仍然适用于 64 位机器,今天的标准,能够处理 256 TB。在短短 43 年内增加了 40 亿倍,这是一个相当惊人的进步。 C 语言通过将类型名称作为关键字幸存下来,就像 C# 而不是假定类型大小。

是的,当前的 C# 编译器对程序 运行 在机器上使用的类型有很强的内在知识。当您在程序中说 int 时,它会在程序集中发出 System.Int32 。抖动和 CLR 也是如此,它们完成了将值类型映射到处理器寄存器和内存的大部分繁重工作。它会永远 发出System.Int32 吗?如果它想在 43 年后仍然具有相关性,那就不行了。或者更早一点,现在融入 C# 的最严格的架构假设是数组的最大大小。它不能有超过 20 亿个元素,用 int 运行s 索引它超出了 gas。当您今天已经有 256 TB 的可用内存时,那当然只是一个小点。

相比之下,128 位处理器也是未来的发展方向。 IBM 按卡车装载量出售它们。你可以用那么多地址 space 做一些非常有趣的架构事情, 文件 的概念变得无关紧要。整个文件系统是内存映射的,如果你想写入一个文件,那么你只需写入内存即可。超过20亿字节的文件在今天当然也不稀奇。

真正必要之前,有几个技术障碍需要清除,硬盘太慢,内存总线带宽太低,正在收集 TB 堆垃圾暂时冻结您的程序 :) 我们将拭目以待。

C# 编译器了解 原始数据类型。每当编译器遇到加法运算符 a + b 时,它都会调用适当的静态方法 operator +.

但是,如果操作数具有原始类型,它会生成用于直接计算的 IL 代码。

但通常编译器和 CLR 试图假装基本类型与其他类型相同。

此外,如前所述,编译器对一些基本类型使用别名,例如intcharbool等。

当然是。

请参阅 C# 规范第 77-85 页:

http://www.microsoft.com/en-us/download/details.aspx?id=7029

此外,C# 是 CLS(公共语言规范)兼容语言,因此它支持 CTS(公共类型系统)中的所有内容: https://msdn.microsoft.com/en-us/library/vstudio/zcx1eb1e(v=vs.110).aspx

编译器直接支持的任何数据类型都称为"Primitive data types"。

在 C# 中,您可以使用以下语法分配整数:

System.Int32 a = new System.Int32();

但是很多编译器(包括c#)允许我们使用下面的语法:

int a = 0; 

我们也可以这样使用:

System.Int32 a = 0;
int a = new int();

所有这些都直接映射到 System.Int32 类型。

即C# 中的所有原始数据类型都直接映射到框架工作 class library(FCL) 中存在的类型。

也如书中所述"CLR via c#",当你在使用的时候,

Int a = 0;

您可以认为 C# 编译器会自动假定源文件中有一个 Using 指令,例如:

Using int = System.Int32;