【问题标题】:Is int? a value type or a reference type? [duplicate]是整数吗?值类型还是引用类型? [复制]
【发布时间】:2013-09-15 15:25:01
【问题描述】:

这个问题更多是关于将? 添加到值类型而不是int?

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

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

【问题讨论】:

  • nullNullable<T> 的支持是语言团队和编译器的幕后花招。
  • 整数? === 可空。 Nullable 是一个值类型,因此 int?是一个值类型。我相信添加了 Nullable 类型是为了与数据库集成一起使用,其中强类型数据字段(在本例中为 int)可以是 0 或更大,或者 null...所有这些在数据库的上下文中都是有效的。
  • 不错的答案 series0ne
  • 您的逻辑是:null 始终是引用类型的“不引用”值,null 是可空值类型的合法值,因此可空值类型是引用类型。如果两个前提为真,则此三段论是正确的,但第一个前提为假。可空值类型只不过是一个布尔值,它表示绑定到不可空值的空值。如果 bool 为 false,则该值被视为 null。可空值类型的空值与空引用的位不同;它们完全不同。

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


【解决方案1】:

int? 等同于Nullable<int>,这意味着它是struct

这意味着它是value type

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

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

Nullable 结构表示一个可以赋值的值类型 空。 Nullable 结构仅支持将值类型用作 可以为空的类型,因为引用类型在设计上可以为空。

所以它有 2 个值;

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

【讨论】:

  • [SerializableAttribute] public struct Nullable where T : struct thx!
  • 我使用反射来检查类型的属性 .Where(p => p.PropertyType.IsValueType) 并且属性包括可空值。所以,这支持了你所说的。
【解决方案2】:

【讨论】:

    【解决方案3】:

    int? 不是引用类型。它是一个struct(值类型)。

    它有自己的值,就像一个普通的 int 加上一个额外的“null”值。对于 Nullable 类型,您可以使用 HasValue 检查它是否有值。

    MSDN

    【讨论】:

      【解决方案4】:

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

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

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

      • 它们是否包含null
      • 它们是否是值类型

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

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2010-12-04
        • 2013-07-14
        • 2013-01-11
        • 2010-11-07
        • 1970-01-01
        • 2020-12-29
        • 2011-01-21
        • 1970-01-01
        • 2015-04-12
        相关资源
        最近更新 更多