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
当然,像 int 和 bool 这样的类型名称在 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 试图假装基本类型与其他类型相同。
此外,如前所述,编译器对一些基本类型使用别名,例如int
、char
、bool
等。
当然是。
请参阅 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;
在 C++ 中,编译器 知道 原始数据类型,例如 int
,但在 C# 中,这些基本上是结构(例如 System.Int32
)。但是我可以假设 C# 知道 这些类型吗?我认为确实如此,因为 C# 中的 int
文字基本上是 System.Int32
的一个实例。例如,这将起作用:
Console.WriteLine((12345).GetType());
输出:
System.Int32
当然,像 int 和 bool 这样的类型名称在 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 试图假装基本类型与其他类型相同。
此外,如前所述,编译器对一些基本类型使用别名,例如int
、char
、bool
等。
当然是。
请参阅 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;