12

这篇 MSDN 文章处理数据类型。

它说:

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

另一方面,C# 中的所有原始数据类型都是 System 命名空间中的对象。对于每种数据类型,都提供了一个短名称或别名。例如,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 结构至少对我来说将是无休止的递归和极大的困惑。

4

2 回答 2

14

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

C# 中的原始类型没有像 Java 中那样的包装器类型,而且intfor的别名System.Int32也不像包装器。只是System.Int32名字不同而已。

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

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

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

爪哇:int->Integer

C#:int->System.Int32

但事实并非如此。在 Java 中,int是一个原始类型,并且是一个类,当s 需要被装箱时Integer充当包装器。在 C# 中,完全一样的东西(原始类型)intintintSystem.Int32

如果要相信 MSDN,那么 System.Int32 结构至少对我来说将是无休止的递归和极大的困惑。

System.Int32和C#int中的类型完全相同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;

可以改写为

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完全相同的东西。然后,您应该参考上一个问题,了解内置类型的特殊处理。

于 2013-08-02T13:46:18.287 回答
6

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

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

也就是说,int不会其存储为类型引用System.Int32——它将是int由 CLI 提供的。但这正在深入到 CLI/CLR 的内部。对于不属于 CLR/BCL 的任何代码,int并且System.Int32可以被视为同义词。

如果您想仔细研究 .NET 框架规范,可以从这里MS Partition II.pdf下载它们(我是从文档中引用的)

于 2013-08-02T13:52:00.583 回答