簡體   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