繁体   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