‘.’ null 可空操作符

问题描述 投票:0回答:2

如何访问 null nullable 的属性

HasValue

我查看了编译后的代码,它不是语法糖。

为什么这不会抛出 NullReferenceException:

int? x = null;
if (x.HasValue)
{...}
c# .net null nullable
2个回答
11
投票

那是因为

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
属性。


1
投票

就像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 的备注部分中有更多有关结构的信息。

© www.soinside.com 2019 - 2024. All rights reserved.