c# - ? C# 中的(可空)运算符

标签 c# nullable

<分区>

通过在值类型数据类型上应用可空运算符改变了什么,现在它可以存储空值。

最佳答案

正如其他人所说,“?”只是将其更改为 Nullable<T> 的简写.这只是另一种带有 bool 标志的值类型,用于说明是否真的有有用的值,或者它是否是该类型的空值。换句话说,Nullable<T>看起来有点像这样:

public struct Nullable<T>
{
    private readonly bool hasValue;
    public bool HasValue { get { return hasValue; } }

    private readonly T value;
    public T value
    {
        get
        {
            if (!hasValue)
            {
                throw new InvalidOperationException();
            }
            return value;
        }
    }

    public Nullable(T value)
    {
        this.value = value;
        this.hasValue = true;
    }

    // Calling new Nullable<int>() or whatever will use the
    // implicit initialization which leaves value as default(T)
    // and hasValue as false.
}

显然在实际代码中有更多的方法(如 GetValueOrDefault() )和转换运算符等。C# 编译器添加了 lifted 运算符,这些运算符有效地代理了 T 的原始运算符。 .

冒着听起来像破纪录的风险,这仍然是一种值(value)类型。它涉及拳击......当你写的时候:

int? x = null;

那不是空引用 - 它是Nullable<int> 的空值,即hasValuefalse .

当一个可为 null 的类型装箱时,CLR 有一个特性,即值要么被装箱为一个空引用,要么是一个普通的装箱 T。所以如果你有这样的代码:

int? x = 5;
int y = 5;

object o1 = x;
object o2 = y;

o1 引用的盒装值和 o2是无法区分的。您不能说一个是装箱可空类型的结果。

关于c# - ? C# 中的(可空)运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3183818/

相关文章:

c# - 在可为空的 int 和 int 之间转换

spring-webflux - WebFlux 和 null 值

c# - 如何开始使用 C# 编写 iPad、iTouch 和 Android 应用程序?

c# - 在重定向时显示动画 gif 文件直到 asp 页面加载?

c# - MySQL Linq 使用 .Contains(变量)

rust - 是否有一种简单的方法来链接返回选项值的函数的结果?

c# - 可空不是 ValueType

c# - 什么是 `Nullable<T>?` ?

c# - 如何在领域驱动设计中为领域模型编写领域逻辑?

c# - 泛型指针?