C#7.0的新特性
Out 变量(Out variables)
在之前的 C# 版本中,使⽤ out 参数并不像我们期盼的那样流畅。在你能够使⽤ out 参数来调⽤⼀个函数之前,你⾸先需要声明待传⼊的变量。同时由于你⼀般不会初始化这些变量(它们毕竟会被这些⽅法覆写),你也⽆法使⽤ var 来声明它们,⽽是需要指定完整的类型:
public void PrintCoordinates(Point p)
{
int x, y; // 需要“预声明”
p.GetCoordinates(out x, out y);
WriteLine(
"({x}, {y})");
}
请注意,这些变量位于包含它们的代码块的作⽤域,因此之后的代码可以使⽤它们。许多种类的语句不会建⽴它们⾃⼰的代码块,因此在这些语句中声明的 out 变量通常被引⼊到(这个)封闭作⽤域中。
由于 out 变量直接以 out 参数的形式声明,编译器通常可以分辨它们的类型应该是什么(除⾮有冲突的重载),所以完全可以⽤ var 替代类型来声明它们:
p.GetCoordinates(out var x, out var y);writeline用什么替代
Out 参数的⼀个常见使⽤场景是会返回⼀个指⽰是否成功的 Try… 模式,然后 out 参数来携带获得的结果:
public void PrintStars(string s)
{
if (int.TryParse(s, out var i)) { WriteLine(new string('', i)); }
else { WriteLine("Cloudy - no stars tonight!"); }
}
我们也允许以 _(下划线)形式“舍弃” out 参数,来使你忽略你不关⼼的参数:
p.GetCoordinates(out var x, out _); // 我只关⼼ x
模式匹配(Pattern matching)
C# 7.0 引⼊了模式匹配的概念,⼀种从抽象的⾓度来说,指可以测试⼀个值是否有某种特定的“形状”、并在满⾜这⼀条件的时候从值中提取信息的句法元素。
C# 7.0 中的模式的例⼦有:
c(c 为 C# 中的⼀个常量表达式)形式的常量模式(Constant pattern),来测试输⼊是否等于 c
T x(T 为⼀个类型,x 为⼀个标识符)形式的类型模式(Type pattern),来测试输⼊是否有类型 T,并在满⾜条件的时候将值提取成全新的 T 类型的变量 x
var x(x 为⼀个标识符)形式的变量匹配(Var patterns),这种匹配总是能够成功,并会将输⼊的值简单的放⼊⼀个全新的与输⼊类型相同的变量 x 中。
这只是个开始——模式现在是 C# 中的⼀种新的语⾔元素了,我们也希望在未来能向 C# 中加⼊更多的模式。
在 C# 7.0 中我们⽤模式改进了两个已有的语⾔结构:
is 表达式的右边现在可以是表达式,⽽不仅仅是类型了
switch 语句中的 case ⼦句现在可以匹配模式,⽽不仅仅是常量了
在未来的 C# 版本中我们会添加更多可以使⽤模式的地⽅。
具有模式的 Is 表达式
这⾥有⼀个⽤常量模式和类型模式来使⽤ is 表达式的例⼦:
public void PrintStars(object o)
{
if (o is null)return; // 常量模式 “null”
if (!(o is int i)) return; // 类型模式 “int i”
WriteLine(new string('', i));
}
如你所见,模式变量(pattern variables)——通过模式引⼊的变量——和之前描述过的 out 变量很像,都可以在表达式中声明,也可以在最近的作⽤域中使⽤。和 out 变量⼀样,模式变量也是可以修改的。我们经常以“表达式变量”来统称 out 变量和模式变量。
模式和 Try 模式通常可以被很好地组合使⽤:
if (o is int i || (o is string s && int.TryParse(s, out i)) { /* 使⽤ i */ }
具有模式的 Switch 语句
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论