当前位置: 首页 符咒

?? 和 ??= 运算符(C# 参考):报仇符

栏目:符咒 作者:符咒法事网 时间:2022-07-18 09:30:20
如果左操作数的值不为null,则null 合并运算符??返回该值;否则,它会计算右操作数并返回其结果报仇符。如果左操作数的计算结果为非null,则??运算符不会计算其右操作数。 C# 8.0 及更高版本中可使用空合并赋值运算符??=,该运算符仅在左侧操作数的求值结果为null时,才将其右侧操作数的值赋值给左操作数报仇符。如果左操作数的计算结果为非null,则??=运算符不会计算其右操作数。 List int numbers = null; int? a = null; (numbers ??=

如果左操作数的值不为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;

运算符可重载性

运算符??和??=无法进行重载报仇符。

阅读:124次

分类栏目