在C ++中,编译器知道有关原始数据类型,例如int
,但在C#中,这些基本上是结构(例如System.Int32
)。但我可以假设C#知道这些类型。我认为确实如此,因为C#中的int
字面值基本上是System.Int32
的一个实例。例如,这将起作用:
Console.WriteLine((12345).GetType());
输出:
System.Int32
答案 0 :(得分:3)
当然,在C#语言中, int 和 bool 等类型名称是 keywords 。与许多语言共享的属性,包括C ++。它们当前映射到您已经知道的.NET Framework中的类型。不要错误地假设System.Int32是 struct ,它肯定不是它在处理器上使用的方式。它是一种易于适合处理器寄存器的类型,对于使程序快速运行非常重要。您可以看到的结构声明仅代表盒装 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 对其进行索引就会耗尽气体。如果你今天已经拥有256TB的内存,那当然只是一点点。
相比之下,128位处理器是今天的未来。 IBM通过卡车装载销售它们。使用那么多地址空间可以做一些非常有趣的架构事情,文件的概念变得无关紧要。整个文件系统是内存映射的,如果要写入文件,则只需写入内存即可。当然,超过20亿字节的文件也不常见。
在真正必要之前要清除一些技术路障,硬盘太慢而内存总线带宽太低,垃圾收集一个TB的堆将冻结你的程序一会儿:)我们必须等等看。
答案 1 :(得分:1)
C#compiler 知道有关原始数据类型的信息。每当编译器遇到加法运算符a + b
时,它就会调用适当的静态方法operator +
。
但是,如果操作数具有基本类型,则它会生成用于直接计算的IL代码。
但通常编译器和CLR都试图假装原始类型与其他类型相同。
另外,正如已经编写的那样,编译器对某些基本类型使用别名,例如int
,char
,bool
等。
答案 2 :(得分:1)
任何数据类型,编译器直接支持称为"原始数据类型"。
在C#中,您可以使用以下语法分配整数:
System.Int32 a = new System.Int32();
但是许多编译器(包括c#)允许我们使用以下语法:
int a = 0;
我们也可以使用如下:
System.Int32 a = 0;
int a = new int();
所有这些都直接映射到System.Int32类型。
即。 C#中的所有原始数据类型都直接映射到框架工作类库(FCL)中存在的类型。
同样如书中所述" CLR通过c#",当您使用时,
Int a = 0;
你可以认为C#编译器会自动假设源文件中有一个Using指令,如:
Using int = System.Int32;
答案 3 :(得分:0)
他们当然是。
请参阅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