C# 7.0 语言新特性

下面是关于在C#7.0语言中计划功能的说明。其中大部分功能在 Visual Studio “15” Preview 4 中能运行。现在是最好的试用时期,请记录下你们的想法。

C#7.0语言增加了许多的新功能,促使专注于数据消费,简化代码和性能。

或许最大的特征是元组(tuples) ,使得它易于有多个结果,并从而简化代码是以对数据的形状为条件的模式匹配。但也有许多其他的一些功能希望将它们结合起来,让代码运行更高效,更明确,从而获得更多的创造性。如果有哪些运行不是你想要的或者有想改进的功能,在Visual Studio的窗口顶部使用“send feedback”功能将结果反馈给我们。在我所描述的许多功能在Preview 4还没有办法充分运行,根据用户的反馈结果,我们将在发布最终版是增加些新的功能。而必须要指出的是,现有计划中的一些功能在最终版也可能会有所改变或取消。

如果你对这个功能设置感兴趣并想学习它,在Roslyn GitHub site上可以找到许多的设计说明和相关讨论。

输出(out)变量

目前在C#中,使用out参数并不像我们想象中那么流畅。在使用out参数调用方法时,你首先必须声明变量传递给它。虽然你通常不会初始化这些变量(他们将通过该方法后所有被覆盖),也不能使用VAR来声明他们,但是需要指定完整的类型:

在C#7.0,我们增加了Out变量,作为out参数传递的点来声明一个变量权:

需要注意的是,变量是在封闭块范围内,所以后续可以使用它们。大多数类型的语句不建立自己的适用范围,因此out变量通常在声明中被引入到封闭范围。

注:在Preview 4中,适用范围规则更为严格:out变量的作用域为它们在声明的说法。因此,上面的例子不会在后续的版本中使用。

由于out变量直接声明作为参数传递给out参数,编译器通常可以告知类型(除非有冲突的过载)。所以这是很好用VAR,而不是一个类型来声明它们:

out参数的一个常见的用途是Try...模式,其中out参数一个boolean return表示成功,out参数进行得到的结果:

1
2
3
public void PrintStars(string s)
{    if (int.TryParse(s, out var i)) { WriteLine(new string(*, i)); }    else { WriteLine("Cloudy - no stars tonight!"); }
}

:Preview 4处理的比较好的地方在于只是用if语句定义它。

计划允许“wildcards”作为out参数以及在*的形式,忽视不重要的out参数:

注:wildcards能否把它变成C#7.0还是个未知数。

模式匹配

C# 7.0 引入了模式的概念,抽象地说,这是一种语法成分可以用来测试一个值是否有一个一定的“形”以及在它起作用时从值里面获取到的额外信息。

下面是 C# 7.0 中关于模式的例子:

c 的常量模式(c 是C#中的一个常量表达式),用于测试输入的参数是否和 c 相等

T x 的类型模式(T 是一个类型,x 是一个标识符),用于测试输入的参数是否有类型 T,如果有,提取输入参数的值到一个 T 类型的新 x 变量中。

var x 变量模式(x 是一个标识符),通常会匹配并简单地将输入参数的值放进一个新变量 x 中

这是个开始,模式是一种新的 C# 语言元素,而且我们将来可以把它们更多地增加到 C# 中。

在 C# 7.0 中,我们正在使用模式以增强两种已存在的语言结构:

is 表达式现在在右边可以有一个模式,而不只是一个类型

case 子句在 switch 语句中现在可以通过模式匹配,而不仅仅是常量值

在将来的C#中,我们或许会增加更多能使用模式的地方。

......

文章略长,且涉及大量代码,全文请点击阅读原文查看

开源中国|ID:oschina2013

扫一扫,关注OSChina微信号

每天为你送上精选资讯早点

还有每天的 OSChina 乱弹哦