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中等待 – 现在可以在
catch
和finally
块中使用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
简写而开始,但演变为可以生成string
或IFormatble
。 请参阅当前规范以获取更多信息。
顺便说一下, 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糖。