C# 带问号 ? 的操作符大全:?:、?.、?[]、??、??=

C# 带问号 ? 的操作符有好几个。

Conditional operator ?:

c = a ? b1  : b2

如果 a 为 true,c 等于 b1,否则 b2。

Null-conditional operators ?. and ?[]

假设 obj 可为 null,那么传统写法是如下:

if (obj != null)
{
    if (obj.Length > 2)
    {
    }
}

现在我们可以简写了:

if (obj?.Length > 2)
{
}

当 obj 是 null 时,obj?.Length 为 null,而 null >2 返回 false,所以效果和传统写法是一样的。请参见:关于 CSharp 值-?. 的默认值。

?[] 与 ?. 类似,只是 ?. 调用的是成员,?[] 调用的是元素罢了。

Null-coalescing operator ?? and ??=

coalescing [ˌkoʊəˈlesɪŋ],合并、联合、聚合。

  • 当左边不为 null 时,使用左边的值。

  • 当左边的是 null 时,使用右边的值。

var a = n1 ?? 0;

?? 也常常与 ?. 搭配使用,比如:

var date = obj?.Date ?? defaultDate;

而 ??= 则多了一层赋值含义,比如:

if (a is null)
{
    a = 1;
}

现在可以简化为:

a ??= 1;

继续:

list.Add(a ?? 1); // a 不为 null,则 list.Add(a); 否则 list.Add(1)。
list.Add(a ??= 1); // a 不为 null,则 a = 1; 然后 list.Add(a)。这里这种写法不好,因为它干了 2 件事。

优先级

??、??= 都是从右边开始算过来的。

a ?? b ?? c
d ??= e ??= f

等效于:

a ?? (b ?? c)
d ??= (e ??= f)

你可能感兴趣的