C# 问号用法-NULL检查运算符?.、空合并运算符??、 可空类型修饰符?、

NULL检查运算符(?.)

见下面代码:

void test(object obj)
{
    // obj 没有进行 `NULL` 检查,可能会报错
    string s = obj.ToString();

}

没有进行 NULL 检查,正确的版本是这样的:

void test(object obj)
{
    string s = "";
    if(obj != null){
        s = obj.ToString();
    }
}

正确倒是正确了,代码取变得难读多了。在C# 6.0中,引入了一个 ?. 的运算符,前面的代码可以改成如下形式:

void test(object obj)
{
    string s = obj?.ToString();
}

从这个例子中我们也可以看出它的基本用法:如果对象为 NULL,则不进行 . 后面的操作,直接返回 NULL

空合并运算符(??)

如果此运算符的左操作数不为 null,则此运算符将返回左操作数,否则返回右操作数。

例如:a??b 当 a 为 null 时则返回 b,a不为 null 时则返回a本身

string test(string a,string b)
{
    return a??b;
}

?. 和 ?? 结合使用

void test(object obj)
{
    // 如果 obj为null就返回 "",否则就返回 obj.ToString()
    string s = obj?.ToString() ?? "";
}

可空类型修饰符(?)

引用类型可以使用空引用表示一个不存在的值,而值类型通常不能表示为空。
例如:int i=null; 编译器就会报错。
为了使值类型也可为空,就可以使用 可空类型,即用可空类型修饰符 ? 来表示,表现形式为 T?

例如:

  • int? 表示可空的整形

  • DateTime? 表示可为空的时间

T? 其实是 System.Nullable(泛型结构) 的缩写形式,

例如:int? 编译后是 System.Nullable

参考:
https://www.cnblogs.com/youmingkuang/p/11459615.html