如何访问 null nullable 的属性
HasValue
?为什么这不会抛出 NullReferenceException:
int? x = null;
if (x.HasValue)
{...}
那是因为
int?
是 Nullable<int>
的缩写,它是值类型,而不是引用类型 - 所以你永远不会得到 NullReferenceException
。
Nullable<T>
结构看起来像这样:
public struct Nullable<T> where T : struct
{
private readonly T value;
private readonly bool hasValue;
//..
}
当您分配
null
时,编译器的支持会发生一些神奇的事情(编译器了解 Nullable<T>
并以这种方式特殊对待它们),它只是将本实例的 hasValue
字段设置为 false - 然后返回通过 HasValue
属性。
就像BrokenGlass所说,
int?
实际上是Nullable<T>
。
结构总是包含一个值。 通常您不能将结构变量设置为 null,但在这种特殊情况下您可以,本质上将其设置为
default(Nullable<T>)
。 这会将其内容设置为 null 而不是变量本身。
当您将
Nullable<T>
设置为值时,它会使用隐式运算符将 Value = value
设置为新值和 HasValue = true
。
当您将
Nullable<T>
设置为 null 时,它会将结构的所有字段清空。 对于 bool
字段,例如 HasValue
、null == false
。
由于
Nullable<T>
变量是一个结构体,因此该变量始终可以被引用,因为它的内容为 null 而不是变量本身。
MSDN 页面 struct 的备注部分中有更多有关结构的信息。