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)