作者丨Jonathan Allen
译者丨刘雅梦
尽管 C# 8.0 还需要几个月的时间才能发布,但是 C# 8.x 的特性计划已经开始了。该计划中的特性有一些是新提出的,而另外一些则是之前在 C# 8 中考虑过的。和往常一样,这个特性列表仍可能会发生变化。
如之前的一个报告所讨论的那样,Caller Expression Attribute 特性允许函数捕获用于生成其参数的表达式。它主要用于断言和自动化测试。
new 关键字类型推断(正式名称为目标类型“new”表达式),能在通过上下文可以确定类型名称的情况下减少样板代码。
虽然目前对于 Defer 声明 的反对率高达到 3:1,但是在 8.x 版本,Defer 声明仍然在考虑的特性列表中。
这实际上是两个需求(#33 和 #881),它使我们在处理可为空值类型和三元运算符时不再需要添加显式强制转换了。在 NULL 增强公共类型的建议下,将允许如下的使用场景。
int a;
int? x1 = condition ? a : null;
int? b;
double c;
double? x2 = condition ? b : c;
在推断数组类型或 lambda 表达式的返回类型时,也支持这种改进。
基于 C 语言的一个特性是赋值是表达式,而不仅仅是语句。这允许了诸如 a=b=c=0 的快捷赋值方式,但也允许了诸如 if(a=false)的错误。因此,许多设计指南都禁止在另一个语句中修改变量。
C# 一直在相反的方向上发展,它能够在诸如输出参数等新的地方定义变量,并作为模式匹配的一部分。使用声明表达式,我们几乎可以在任何可以执行赋值的地方声明变量。
以前你需要写如下的代码,
char ch;
while ((ch = GetNextChar()) == 'a' || ch == 'b' || ch == 'c')
现在它可以缩短成如下代码:
while ((char ch = GetNextChar()) == 'a' || ch == 'b' || ch == 'c')
下面是你可能会写的另一个示例:
var sum = (var p = GetPoint(); p.X + p.Y);
在解构时混合声明和变量是一种相关特性的能力。它首次是在 C# 7.1 中提出的,它将允许在新定义某些(而不是全部)变量时进行多重赋值。
(x, var y) = e;
本地函数的一个限制是它们不能应用属性(这只是 C# 的一个限制;CLR 允许这样做)。在 C# 8 中,它可能引起问题的原因是,可能需要诸如 NotNullWhenTrue 之类的属性来为可空性检查获取正确的语义。
再比如,使用本地函数的属性可以更方便地配置 ASP.NET 的路由。
原文链接:
https://www.infoq.com/news/2019/07/CSharp-8x/
点个在看少个 bug 👇