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

时间:2013-08-02 13:36:32

标签: c#

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结构将无限递归,至少对我来说非常困惑。

2 个答案:

答案 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#中, intSystem.Int32完全相同 (基本类型)

  

如果要相信MSDN,System.Int32结构将无限递归,至少对我来说非常困惑。

System.Int32int 与C#完全相同类型; int仅仅是System.Int32的便捷别名。在Java中,intInteger distinct 。在C#中,intSystem.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;

并且这根本不会改变含义,因为intSystem.Int32 完全相同。然后,您应该参考之前的question来了解内置类型的特殊处理。

答案 1 :(得分:6)

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

  

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

也就是说,int存储为System.Int32的类型引用 - 它将存储到CLI提供的int。但这已经深入到CLI / CLR的内部。对于不属于CLR / BCL的任何代码,intSystem.Int32可视为同义。

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