使用 vs2017 体验c#7.0新特性
前言
其实2016年12月就已经公布的C#7.0新特性了,但笔者的IDE一直用的VS2015,正巧前段时间升级到2017,下面总结一下。
官方介绍地址:What’s new in C# 7,中文版C# 7 中的新增功能
先列一下相关语法:
- out-variables (out 变量)
- Tuples (元组)
- Discards (丢元)
- Pattern Matching (匹配模式)
- ref locals and returns (局部变量和返回结果)
- Local Functions (本地函数)
- More expression-bodied members (更多的 expression-bodied 成员)
- throw Expressions (throw 表达式)
- Generalized async return types (通用的异步返回类型)
- Numeric literal syntax improvements (数字文本语法改进)
正文
1.out-variables (输出变量)
C#7.0之前,使用out参数可能不像我们想的那样方便。在你调用一个带有out参数的方法之前,你必须首先声明一个变量并传递给它。你通常不会初始化这些变量(毕竟它们会被方法重写),也不能用var去声明他们,而是必须指定数据的完整类型。
public void PrintCoordinates(Point p)
{
int x, y;//必须预定义
p.GetCoordinates(out x, out y);
WriteLine($"({x},{y})");
}
在c#7.0中,我们添加了out变量,可以在给一个函数传入参数的时候再去定义变量。
public void PrintCoordinates(Point p)
{
p.GetCoordinates(out int x, out int y);
WriteLine($"({x},{y})");
}
由于out变量会直接被当做out参数来声明,因此编译器通常可以知道它们应该是什么类型(除非它们被重载),所以我们可以使用var来定义,而不必使用真正的类型。
p.GetCoordinates(out var x, out var y);
2.Tuples (元组)
在.NET4.0中,微软对多个返回值给了我们一个解决方案叫元组,类似代码如下:
static void Main(string[] args)
{
var data = GetFullName();
Console.WriteLine(data.Item1);
Console.WriteLine(data.Item2);
Console.WriteLine(data.Item3);
Console.ReadLine();
}
static Tuple<string, string, string> GetFullName()
{
return new Tuple<string, string, string>("a", "b", "c");
}
上面代码展示了一个方法,返回含有3个字符串的元组,然而当我们获取到值,使用的时候 心已经炸了,Item1,Item2,Item3是什么鬼,虽然达到了我们的要求,但是实在不优雅。而在C#7.0中,微软提供了更优雅的方案:(注意:需要通过nuget引用System.ValueTuple)如下:
static void Main(string[] args)
{
var data=GetFullName();
Console.WriteLine(data.a); //可用命名获取到值
Console.WriteLine(data.b);
Console.WriteLine(data.c);
Console.ReadLine();
}
//方法定义为多个返回值,并命名
private static (string a,string b,string c) GetFullName()
{
return ("a","b","c");
}
解构元组,有的时候我们不想用var匿名来获取,那么如何获取abc呢?我们可以如下:
static void Main(string[] args)
{
//定义解构元组
(string a, string b, string c) = GetFullName();
Console.WriteLine(a);
Console.WriteLine(b);
Console.WriteLine(c);
Console.ReadLine();
}
private static (string a,string b,string c) GetFullName()
{
return ("a","b","c");
}
3.Discards (丢元)
参考文档: