可空类型是引用类型吗?
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
约束。此外,当您使用等于false
的HasValue
对可空类型进行装箱时,您将得到一个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。
【讨论】:
以上是关于可空类型是引用类型吗?的主要内容,如果未能解决你的问题,请参考以下文章