繁体   English   中英

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

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

C#中的空值

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

<Nullable>enable</Nullable>

由于此处描述的问题而添加到项目文件中。

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

混乱

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

我发现的例子非常理论化,有人可以给我这个运算符实际应用吗? 提前致谢!

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

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

最简单的用例是,根据我们之前所做的 C# 版本:

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

或者

number = number ?? someValue;

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

number ??= someNumber;

一个真实世界的例子:

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

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

空合并运算符?? 如果它不为空,则返回其左侧操作数的值; 否则,它评估右侧操作数并返回其结果。 ?? 如果左侧操作数的计算结果为非空,则运算符不会计算其右侧操作数。

在 C# 8.0 及更高版本中可用,空合并赋值运算符??=仅当左手操作数的计算结果为空时,才将其右手操作数的值分配给其左手操作数。 如果左侧操作数的计算结果为非空,则??=运算符不会计算其右侧操作数。

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

你可以在这里找到更多信息

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM