[英]Null-conditional operator and string interpolation in C# 6
没有一般规则,它有所不同。 一些功能只是语法糖,一些功能以前是不可能的,有些是两者的组合。
字符串插值 - 这个:
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
使用await
并finally
阻塞:
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
简写形式开始,但演变为可以生成string
或IFormatble
。 请参阅当前规范以获取更多信息。
顺便说一句, 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.