可空类型是引用类型吗?

Posted

技术标签:

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

当我将 int 声明为可为空时

int? i=null;

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

【问题讨论】:

【参考方案1】:

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

    数据类型的值(int 对应 int?DateTime 对应 DateTime? 等)。 一个布尔值,它表明数据类型值是否已设置。 (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。

【讨论】:

以上是关于可空类型是引用类型吗?的主要内容,如果未能解决你的问题,请参考以下文章

可空引用类型 - 通过接受的参数返回类型可空性

将可空引用类型转换为不可空引用类型,不那么冗长

引用类型与可空类型 ToString()

C# 8中的可空引用类型

可空引用类型意外 CS8629 可空值类型可能为带有临时变量的空

使用可空引用类型时,OData 元数据不生成可空方面