?? 和 ??= 运算符(C# 参考):驱鬼辟邪符
如果左操作数的值不为null,则null 合并运算符??返回该值;否则,它会计算右操作数并返回其结果驱鬼辟邪符。如果左操作数的计算结果为非null,则??运算符不会计算其右操作数。
C# 8.0 及更高版本中可使用空合并赋值运算符??=,该运算符仅在左侧操作数的求值结果为null时,才将其右侧操作数的值赋值给左操作数驱鬼辟邪符。如果左操作数的计算结果为非null,则??=运算符不会计算其右操作数。
List int numbers = null;
int? a = null;
(numbers ??= newList int).Add( 5);
Console.WriteLine( string.Join( " ",numbers)); // output: 5
numbers.Add(a ??= 0);
Console.WriteLine( string.Join( " ", numbers)); // output: 5 0Console.WriteLine(a); // output: 0
??=运算符的左操作数需要是变量、??=或索引器元素驱鬼辟邪符。
在C# 7.3 及更早版本中,??运算符左操作数的类型需要是??或可以为null 的值类型驱鬼辟邪符。从C# 8.0 版本开始,该要求替换为以下内容:??和??=运算符的左操作数的类型需要是可以为null 的值类型。特别是从C# 8.0 开始,可以使用具有无约束类型参数的null 合并运算符:
privatestaticvoidDisplayT(T a, T backup){
Console.WriteLine(a ?? backup);
null 合并运算符是右结合运算符驱鬼辟邪符。也就是说,是窗体的表达式
a ?? b ?? cd??= e ??= f
会像这样求值
a?? (b ?? c)d ??= (e ??= f)
示例
??和??=运算符在以下应用场景中很有用:
在包含null 条件运算符?. 和?[]的表达式中驱鬼辟邪符,当包含null 条件运算的表达式结果为null时,可以使用运算符来提供替代表达式用于求值:
doubleSumNumbers( List double[] setsOfNumbers, intindexOfSetToSum )
returnsetsOfNumbers?[indexOfSetToSum]?.Sum ?? double.NaN;
varsum =SumNumbers( null, 0);Console.WriteLine(sum); // output: NaN
当使用可以为null 值类型并且需要提供基础值类型的值时驱鬼辟邪符,可以使用运算符指定当可以为null 的类型的值为null时要提供的值:
int? a = null; intb = a ?? -1;
Console.WriteLine(b); // output: -1
如果可以为 null 的类型的值为 null 时要使用的值应为基础值类型的默认值,请使用 NullableT.GetValueOrDefault方法驱鬼辟邪符。
从 C# 7.0 开始驱鬼辟邪符,可以使用 表达式作为 ?? 运算符的右操作数,以使参数检查代码更简洁:
publicstring Name {
get =name;
set =name = value ?? thrownewArgumentNullException(nameof(value), "Namecannot be null");
前面的示例还演示了如何使用 expression-bodied 成员来定义属性驱鬼辟邪符。
从 C# 8.0 开始驱鬼辟邪符,可以使用 ??= 运算符将这样的代码
if(variableis null)
variable = expression;
替换为以下代码:
variable??=expression;
运算符可重载性
运算符??和??=无法进行重载驱鬼辟邪符。
转载声明:本站发布文章及版权归网上道教,符咒批发,道教符咒,茅山符咒,符咒灵符,手绘符,手绘灵符,道家招财符咒,网上祭奠,网上祭拜,在线许愿网,网上拜财神,代烧香,代烧香祈福,代烧纸钱,招财符咒,婚姻和合符咒,回心转意符咒,桃花符咒,事业符咒,平安符咒,平安健康符咒,求子符咒,怀孕符咒,道教求子咒,求子怀孕符咒,网上道观,线上道观所有,转载本站文章请注明文章来源!