关于C#中的原始数据类型

msi*_*yer 11 c#

这篇MSDN文章涉及数据类型.

它说:

对于Java中的每个原始数据类型,核心类库提供了一个包装类,将其表示为Java对象.例如,Int32类包装int数据类型,Double类包装double数据类型.

另一方面,C#中的所有原始数据类型都是System命名空间中的对象.对于每种数据类型,都提供了短名称或别名.例如,int是System.Int32的短名称,double是System.Double的缩写形式.

我跑到Mono代码来读取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;
Run Code Online (Sandbox Code Playgroud)

我假设MS将以相同的方式实现结构.这与包装器有什么不同吗?文件试图传达的究竟是什么?

如果MSDN被认为是System.Int32结构将无限递归,至少对我来说非常困惑.

jas*_*son 13

这与包装器有什么不同吗?

有没有包装类在C#中像有Java中的基本类型和别名intSystem.Int32不喜欢的包装东西.这只是System.Int32一个不同的名字.

C#中的原始类型可以装箱,就像它们可以在Java中一样,但是在C#中它们被装箱时它们被装箱,System.Object而在Java中它们被装箱到它们的包装类型.

文件试图传达的究竟是什么?

这两种相似但不同的语言之间存在差异.天真地看,这些东西看起来是一样的:

Java:int- >Integer

C#:int- >System.Int32

但事实并非如此.在Java中,它int是一种基本类型,并且Integer是一个类,用作需要装箱intint的包装器.在C#,int并且System.Int32是完全一样的东西 (基本类型).

如果MSDN被认为是System.Int32结构将无限递归,至少对我来说非常困惑.

System.Int32int恰好在C#同一类型; int只是一个方便的别名System.Int32.在Java中,int并且Integer截然不同的.在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;
Run Code Online (Sandbox Code Playgroud)

可以改写成

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;
Run Code Online (Sandbox Code Playgroud)

这根本不会改变的意思,因为intSystem.Int32确切同样的事情.然后,您应该参考上一个问题来了解内置类型的特殊处理.


Dam*_*ver 6

Re:递归定义.公共语言基础结构(CLI)中内置了某些类型.被告诉:

CLI内置类型具有在基类库中定义的相应值类型.它们只能使用特殊编码在签名中引用(即,不使用通用值类型TypeReference语法).分区I指定内置类型.

即,int被存储为类型参考System.Int32-这将是对int由CLI提供.但这已经深入到CLI/CLR的内部.对于不是CLR/BCL的一部分,任何代码intSystem.Int32可以被视为同义.

如果你想了解.NET框架规范,可以从这里下载(我从MS Partition II.pdf文档中引用)