This MSDN article处理数据类型。
它说:
对于Java中的每个原始数据类型,核心类库提供 一个包装类,将其表示为Java对象。例如, Int32类包装int数据类型,Double类包装 双数据类型。
另一方面,C#中的所有原始数据类型都是对象 系统名称空间对于每种数据类型,都是短名称或别名 提供。例如,int是System.Int32和的简称 double是System.Double的缩写形式。
我跑到Mono代码来阅读System.Int32 struct的实现。
我发现了几行迫使我提出这个问题:
public const int MaxValue = 0x7fffffff;
public const int MinValue = -2147483648;
// This field is looked up by name in the runtime
internal int m_value;
我假设MS会以相同的方式实现结构。这与包装器有什么不同吗?文件究竟试图传达什么?
如果要相信MSDN,System.Int32结构将无限递归,至少对我来说非常困惑。
答案 0 :(得分:13)
这与包装器有什么不同吗?
C#中的原始类型没有包装类型,就像在Java中一样,而int
的别名System.Int32
也不像包装器。这只是System.Int32
的不同名称。
C#中的原始类型可以是boxed,因为它们可以在Java中使用,但在C#中,当它们被装箱时,它们被装箱为System.Object
而在Java中它们被装箱到它们的包装类型。 / p>
文件究竟试图传达什么?
这两种相似但不同的语言之间存在差异。在天真的眼神中,它会看起来就像这些东西是一样的:
Java:int
- > Integer
C#:int
- > System.Int32
但事实并非如此。在Java中,int
是基本类型,Integer
是一个类,当int
需要加框时,它作为int
的包装。在C#中, int
和System.Int32
完全相同 (基本类型)。
如果要相信MSDN,System.Int32结构将无限递归,至少对我来说非常困惑。
System.Int32
和int
与C#完全相同类型; int
仅仅是System.Int32
的便捷别名。在Java中,int
和Integer
是 distinct 。在C#中,int
和System.Int32
不不同。
所以,非常清楚:
public const int MaxValue = 0x7fffffff;
public const int MinValue = -2147483648;
// This field is looked up by name in the runtime
internal int m_value;
可以改写为
public const System.Int32 MaxValue = 0x7fffffff;
public const System.Int32 MinValue = -2147483648;
// This field is looked up by name in the runtime
internal System.Int32 m_value;
并且这根本不会改变含义,因为int
和System.Int32
完全相同。然后,您应该参考之前的question来了解内置类型的特殊处理。
答案 1 :(得分:6)
Re:递归定义。公共语言基础结构(CLI)中内置了某些类型。我们被告知:
CLI内置类型具有在基类库中定义的相应值类型。他们应该是 仅使用其特殊编码在签名中引用(即,不使用通用值类型 TypeReference语法)。分区I指定内置类型。
也就是说,int
将不存储为System.Int32
的类型引用 - 它将存储到CLI提供的int
。但这已经深入到CLI / CLR的内部。对于不属于CLR / BCL的任何代码,int
和System.Int32
可视为同义。
如果你想了解.NET框架规范,可以从here下载(我引用了MS Partition II.pdf
文档)