C#7.0中新特性汇总

2019-12-30 13:57:28于丽

注意:这里i只用在 if 语句来定义它,所以 Preview 4 可以将这个处理的很好。

我们计划允许以 a* 为形式的“通配符”作为输出参数,这会让你忽略了你不关心参数:


p.GetCoordinates(out int x, out *); // I only care about x

Note:在 C#7.0 中是否会包含通配符还不确定。

模式匹配

C# 7.0 引入了模式概念。抽象地讲,模式是句法元素,能用来测试一个数据是否具有某种“形”,并在被应用时,从值中提取有效信息。

C#7.0 中的模式示例:

•C 形式的常量模式(C是C#中的常量表达式),可以测试输入是否等于C

•T X 形式的类型模式(T是一种类型、X是一个标识符),可以测试输入是否是T类型,如果是,会将输入值提取成T类型的新变量X

•Var x 形式的 Var 模式(x是一个标识符),它总是匹配的,并简单地将输入值以它原本的类型存入一个新变量X中。

这仅仅是个开始 - 模式是一种新型的 C# 中的语言元素。未来,我们希望增加更多的模式到 C# 中。

在 C#7.0,我们正在加强两个现有的具有模式的语言结构:

•is 表达式现在具有一种右手侧的模式,而不仅仅是一种类型

•switch 语句中的 case 语句现在可以使用匹配模式,不只是常数值

在 C#的未来版本中,我们可能会增加更多的被用到的模式。

具有模式的 IS 表达式

下面是使用 is 表达式的示例,其中利用了常量模式和类型模式:


public void PrintStars(object o)
{
if (o is null) return; // constant pattern "null"
if (!(o is int i)) return; // type pattern "int i"
WriteLine(new string('*', i));
}

正如你们看到,模式变量(模式引入的变量)和早前描述的输出变量比较类似,它们可以在表达式中间声明,并在最近的范围内使用。就像输出变量一样,模式变量是可变的。

注:就像输出变量一样,严格范围规则适用于Preview 4。

模式和 Try方法可以很好地协同:


if (o is int i || (o is string s && int.TryParse(s, out i)) { /* use i */ } 

具有模式的 Switch 语句

我们正在归纳 Switch 语句:

•可以设定任何类型的 Switch 语句(不只是原始类型)

•模式可以用在 case 语句中

•Case 语句可以有特殊的条件

下面是一个简单的例子:


switch(shape)
{
case Circle c:
WriteLine($"circle with radius {c.Radius}");
break;
case Rectangle s when (s.Length == s.Height):
WriteLine($"{s.Length} x {s.Height} square");
break;
case Rectangle r:
WriteLine($"{r.Length} x {r.Height} rectangle");
break;
default:
WriteLine("<unknown shape>");
break;
case null:
throw new ArgumentNullException(nameof(shape));
}