是int吗?值类型或引用类型?

时间:2013-09-11 14:29:22

标签: c# int value-type reference-type

此问题更多的是将?添加到值类型而非约int?

在C#中,int是值类型。 int?是值类型还是引用类型?

在我看来,它应该是一个引用类型,因为它可以是null

4 个答案:

答案 0 :(得分:21)

int?相当于Nullable<int>,这意味着它是struct

这意味着它是value type

  

在我看来,它应该是一个引用类型,因为它可以为null。

你的假设是错误的。来自文档;

  

Nullable结构表示可以分配的值类型   空即可。 Nullable结构仅支持使用值类型   可以为空的类型,因为引用类型可以通过设计为空。

所以它有2个值;

  1. 数据的价值
  2. 确定值的布尔值是否已设置。 (Nullable<T>.HasValue

答案 1 :(得分:2)

答案 2 :(得分:1)

int?不是参考类型。它是struct(值类型)。

它有自己的值,如普通的int加上额外的“null”值。使用Nullable类型,您可以使用HasValue检查它是否具有值。

MSDN

答案 3 :(得分:0)

编辑我应该首先从这个例子开始:

考虑枚举。我们编写的每个枚举都会自动扩展Enum,这是一个类。 因此,我们编写的值类型扩展了.NET团队编写的类,它是一个引用类型。

您可以通过两种方式分割类型世界:

  • 是否包含null
  • 是否为值类型

理论上所有组合都是可能的。如果我没有误解,至少在C#中,不能为null的引用类型组合产生一个空集。这种组合没有例子。

基本上所有其他3种组合都是可能的:

  • 可以为null且为值类型的类型
  • 不能为null且为值类型的类型
  • 可以为null且为引用类型的类型

作为值类型或引用类型的性质与null无关(至少在设计和使用语言的方式上,而不是在下面的实际工程细节的方式)。

值类型是导致变量,参数和字段之间的分配以完全克隆实例的类型。 引用类型是不这样做的类型。

这基本上与null 无关,与实例占用的内存类型(无论是堆栈,堆还是其他)。