C#6中的空条件运算符和字符串插值

null条件运算符和插值字符串语法是否只解析为语法糖 ?

空条件运算符( ?. ),它允许通过减少“过度” null检查来清理代码,以及插入字符串( ("\{X}, \{Y}") ),它将参数和格式带入一,是C#6的新function。

这些是否被编译成他们不受欢迎的对应物(即我们试图避免的丑陋代码)?

我为这个天真的问题道歉,我对语言一般没有最好的理解,但我很好奇是否可以在C#5上运行这些function。

我知道在某些情况下Java就是这种情况,这些例子也是如此吗?

没有一般规则,它有所不同。 一些function只是语法糖,一些function以前是不可能的,有些是两者的组合。

句法糖

  • 字符串插值 – 这个:

     string result = $"{bar}"; 

    代替:

     string result = string.Format("{0}", bar); 
  • 空传播运算符( ?. ) – 这:

     var result = Foo()?.Length 

    代替:

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

新function

  • 字符串插值 – 还使用FormattedString添加对IFormattable支持,因此这是可能的:

     IFormattable result = $"{bar}" 
  • 在catch / finally中等待 – 现在可以在catchfinally块中使用await

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

当然,这两个类别中都有更多function,例如exceptionfilter和表达式身体成员。

与C#6.0中的大多数新function一样,如果要使用的变量的实例不为null,则空条件运算符只是简写(语法糖,如果要调用它),以获取成员值的模式。

给定一个类型string ,这个:

 int? l = s?.Length; 

被翻译成:

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

它可以与空合并运算符?? )结合使用:

 int l = s?.Length ?? 0; 

字符串插值也作为string.Format简写而开始,但演变为可以生成stringIFormatble 。 请参阅当前规范以获取更多信息。

顺便说一下, roslyn是编译器平台的代号,而不是语言或它们的function。

调用RaisePropertyChanged事件时,Elvis运算符非常有用。

在过去你会写

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

但是如果PropertyChanged在调用之前设置为null,则存在潜在的multithreading问题。 相反,你可以写:

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

这完全避免了multithreading问题 – 所以它不是Syntax糖。