关于C#中的基元数据类型

本文关键字:数据类型 关于 | 更新日期: 2023-09-27 18:25:54

这篇MSDN文章讨论数据类型。

上面写着:

对于Java中的每个基元数据类型,核心类库提供将其表示为Java对象的包装器类。例如Int32类包装int数据类型,Double类包装双重数据类型。

另一方面,C#中的所有基元数据类型都是系统命名空间。对于每种数据类型,短名称或别名是假如例如,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;

我假设MS会以同样的方式实现该结构。这和包装纸有什么不同吗?文档试图传达的究竟是什么?

如果MSDN被认为是System.Int32结构,那么它将是无休止的递归,至少对我来说是非常令人困惑的。

关于C#中的基元数据类型

这和包装纸有什么不同吗?

C#中的基元类型没有像Java中那样的包装器类型,System.Int32的别名int与包装器完全不同。它只是System.Int32的另一个名字。

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

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

这两种相似但不同的语言是有区别的。天真地看,它会看起来就像这些东西是一样的:

Java:int->Integer

C#:int->System.Int32

但事实并非如此。在Java中,int是一个基元类型,而Integer是一个类,当int需要装箱时,它充当int的包装器。在C#中,intSystem.Int32是完全相同的东西(基元类型)

如果MSDN被认为是System.Int32结构,那么它将是无休止的递归,至少对我来说是非常令人困惑的。

CCD_ 15和CCD_;CCD_ 17只是CCD_ 18的一个方便的别名。在Java中,intInteger是不同的。在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完全是。然后,您应该参考前面的问题,了解内置类型的特殊处理。

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

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

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

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