簡體   English   中英

C#6中的空條件運算符和字符串插值

[英]Null-conditional operator and string interpolation in C# 6

null條件運算符插值字符串語法是否只解析為語法糖

空條件運算符( ?. ),它允許通過減少“過度” null檢查來清理代碼,以及插入字符串( ("\\{X}, \\{Y}") ),它將參數和格式帶入一,是C#6的新功能。

這些是否被編譯成他們不受歡迎的對應物(即我們試圖避免的丑陋代碼)?

我為這個天真的問題道歉,我對語言一般都沒有最好的理解,但我很好奇是否可以在C#5上運行這些功能。

我知道在某些情況下Java就是這種情況,這些例子也是如此嗎?

沒有一般規則,它有所不同。 一些功能只是語法糖,一些功能以前是不可能的,有些是兩者的組合。

句法糖

  • 字符串插值 - 這個:

     string result = $"{bar}"; 

    代替:

     string result = string.Format("{0}", bar); 
  • 空傳播運算符( ?. ) - 這個:

     var result = Foo()?.Length 

    代替:

     var temp = Foo(); var result = (temp != null) ? temp.Length : null; 

新功能

  • 字符串插值 - 還使用FormattedString添加對IFormattable支持,因此這是可能的:

     IFormattable result = $"{bar}" 
  • 在catch / finally中等待 - 現在可以在catch使用awaitfinally阻塞:

     try { } catch { await Task.Delay(1000); } 

當然,這兩個類別中都有更多功能,例如異常過濾器和表達式身份成員。

與C#6.0中的大多數新功能一樣,如果要使用的變量的實例不為null,則空條件運算符只是簡寫(語法糖,如果要調用它),以獲取成員值的模式。

給定一個s類型的string ,這樣的:

int? l = s?.Length;

被翻譯成:

int? l = s == null ? null : s.Length;

它可以與空合並運算符?? )結合使用:

int l = s?.Length ?? 0;

字符串插值也以string.Format簡寫形式開始,但演變為可以生成stringIFormatble 請參閱當前規范以獲取更多信息。

順便說一句, roslyn是編譯器平台的代號,而不是語言或它們的功能。

調用RaisePropertyChanged事件時,Elvis運算符非常有用。

在過去你會寫

if (PropertyChanged != null)
{
    PropertyChanged(this, new PropertyChangedEventArgs(nameof(X));
}

但是如果PropertyChanged在調用之前設置為null,則存在潛在的多線程問題。 相反,你可以寫:

PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(X));

這完全避免了多線程問題 - 所以它不是Syntax糖。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM