【发布时间】:2016-05-12 11:34:27
【问题描述】:
通常,当我们访问具有null 值的对象的属性时,我们将面临null 异常。但是当我们访问Nullableobject 的HasValue 属性时,它会给出一个结果。我想知道幕后的实现是什么。
【问题讨论】:
-
.NET 源是available online。
通常,当我们访问具有null 值的对象的属性时,我们将面临null 异常。但是当我们访问Nullableobject 的HasValue 属性时,它会给出一个结果。我想知道幕后的实现是什么。
【问题讨论】:
如果您还不知道,可以为空的类型,如 int? 只是 Nullable<int>。
C# 中的可空类型只是一种“语法糖”。在编译时,编译器将所有int? 和double? 和bool? 替换为Nullable<int>、Nullable<double> 和Nullable<bool>。
注意Nullable<T> 实际上是一个结构!所以从技术上讲,它永远不能为空!您可以将 null 分配给可空类型的原因是另一种语法糖。当您将 null 分配给可空类型时,它会将其 HasValue 属性设置为 false。当您为其分配一个非空值时,它会将 HasValue 再次设置为 true,并将基础值设置为您正在设置的值。
这是对可空类型如何工作的简要说明。现在回到你的问题:
但是当我们访问 Nullable 对象的 HasValue 属性时,它会给出一个结果
我猜你是说
但是当我们访问a的
HashValue属性时,比如int?,它永远不会抛出异常,即使变量是null!为什么?
正如我之前所说,Nullable<T> 是一个结构,所以它永远不能为空。这就是为什么您可以访问HasValue 属性并且永远不会抛出异常的原因。
“但是为什么访问可空对象的Value 属性有时会引发异常?”你可能会问。
这是因为 Nullable<T> 结构的实现。如您所见here:
public T Value {
get {
if (!hasValue) {
ThrowHelper.ThrowInvalidOperationException(ExceptionResource.InvalidOperation_NoValue);
}
return value;
}
}
它检查hasValue 是否为真。如果为 false,则抛出异常。
所以这就是原因。
【讨论】: