C# 中空合并赋值运算符的实际用途?

Practical purpose of the null-coalescing assignment operator in C#?

C# 中的空值

C# 的一项新功能允许我们使用可空引用类型摆脱代码中的空值。我们鼓励添加

<Nullable>enable</Nullable>

由于described here.

等问题导致项目文件

当然,很多现有的项目不想添加这个。启用此功能时需要解决许多错误,因此许多 legacy nulls 仍然存在。但是我们真的需要语言中的额外空功能吗?

困惑

在同一 C# 8.0 版本中,引入了空合并赋值运算符 (??=)(请参阅 the docs)。我理解这种行为,但它为我们解决了哪些问题?为什么我们要将 b 分配给 x 当它为 null x ??= b 并且有例如x = a 什么时候不为空?

我找到的例子非常理论化,谁能给我一个这个运算符的实际应用?提前致谢!

一个真实世界的例子是当支持字段为空时在第一次访问时延迟加载支持字段。像这样:

private string _dbQuery;
private string DbQuery => _dbQuery ??= GetQuery(queryName);

null-coalescing 运算符 ?? returns 其 left-hand 操作数的值(如果它不为空);否则,它计算 right-hand 操作数和 returns 它的结果。如果 left-hand 操作数的计算结果为 non-null.

,则 ?? 运算符不会计算其 right-hand 操作数

在 C# 8.0 及更高版本中可用,null-coalescing 赋值运算符 ??= 将其 right-hand 操作数的值赋给其 left-hand 操作数仅当 left-hand 操作数的计算结果为空时。如果 left-hand 操作数的计算结果为 non-null.

,则 ??= 运算符不会计算其 right-hand 操作数
List<int> numbers = null;
int? a = null;

(numbers ??= new List<int>()).Add(5);
Console.WriteLine(string.Join(" ", numbers));  // output: 5

numbers.Add(a ??= 0);
Console.WriteLine(string.Join(" ", numbers));  // output: 5 0
Console.WriteLine(a);  // output: 0

您可以找到更多信息here

最简单的用例是,根据 C# 版本,我们以前会这样做:

if (number == null)
{
    number = someVale;
}

number = number ?? someValue;

使用新的赋值运算符,我们可以将其进一步缩短为:

number ??= someNumber;

一个真实世界的例子:

public void WriteErrorToLog(string errorMessage, Exception ex)
{
    Log.Warn(errorMessage ??= AppConstants.UnhandledError, ex);
}

这不是一个完美的现实世界示例。但是假设我想记录软错误。编写带有异常的模板消息比生成第二个错误/异常要好得多。