【问题标题】:Are nullable types reference types?可空类型是引用类型吗?
【发布时间】:2011-03-10 02:46:30
【问题描述】:

当我将 int 声明为可为空时

int? i=null;

这里的i会变成引用类型吗?

【问题讨论】:

    标签: c# .net types nullable


    【解决方案1】:

    不,可为空的是一个结构。发生的事情是可空结构有两个值:

    1. 数据类型的值(int 对应 int?DateTime 对应 DateTime? 等)。
    2. 一个布尔值,它表明数据类型值是否已设置。 (HasValue 是财产。)

    当您设置数据类型的值时,结构体将HasValue 更改为true。

    Nullable types (C# Programming Guide)

    【讨论】:

    • 所以,这意味着浅克隆(使用object.MemberwiseClone())一个可为空的将导致一个新的“实例”,对吧?
    【解决方案2】:

    来自Nullable Types (C# Programming Guide)

    Nullable 类型是 System.Nullable 结构的实例。

    Nullable 类型表示可以分配 null 值的值类型变量。您不能基于引用类型创建可为空的类型。 (引用类型已经支持空值。)

    所以,不,它们不是引用类型。

    【讨论】:

      【解决方案3】:

      可空类型既不是值类型也不是引用类型。它们更像值类型,但具有引用类型的一些属性。

      当然,可空类型可以设置为null。此外,可为空的类型不能满足通用的struct 约束。此外,当您使用等于falseHasValue 对可空类型进行装箱时,您将得到一个null 指针,而不是装箱的可空类型(取消装箱也存在类似情况)。

      这些属性使可空类型成为非值类型,但它们肯定也不是引用类型。它们是它们自己的特殊可空值类型。

      【讨论】:

      • 就类型反射 API 而言...typeof(int?).IsValueType 等于 true
      • @Gyromite:是的,因为Nullable<T>struct
      【解决方案4】:

      不,Nullable 类型实际上是一个结构。运行时会智能地为您处理 null 值的设置,呈现引用类型的外观,当它不是时......

      【讨论】:

      • 我会查询“智能处理”,相当主观。就我个人而言,我发现这种行为令人困惑且经常令人讨厌。
      【解决方案5】:

      可空类型不能是引用类型。

      http://msdn.microsoft.com/en-us/library/2cf62fcy.aspx

      【讨论】:

        【解决方案6】:

        您不需要将引用类型设为可为空的类型,因为您可以在其位置传递 null。

        【讨论】:

          猜你喜欢
          • 2010-10-21
          • 2012-08-01
          • 1970-01-01
          • 2019-07-02
          • 1970-01-01
          • 2020-09-21
          相关资源
          最近更新 更多