【问题标题】:Implementation behind (Nullable Type).HasValue [duplicate](Nullable Type).HasValue [重复]
【发布时间】:2016-05-12 11:34:27
【问题描述】:

通常,当我们访问具有null 值的对象的属性时,我们将面临null 异常。但是当我们访问NullableobjectHasValue 属性时,它会给出一个结果。我想知道幕后的实现是什么。

【问题讨论】:

标签: c# .net nullable


【解决方案1】:

如果您还不知道,可以为空的类型,如 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,则抛出异常。

所以这就是原因。

【讨论】:

    猜你喜欢
    • 2010-10-15
    • 2012-11-16
    • 1970-01-01
    • 2013-07-20
    • 2012-03-21
    • 2011-08-18
    • 2015-09-24
    • 1970-01-01
    相关资源
    最近更新 更多