C# 7.0 添加和增强的功能【基础篇】

C# 7.0 版是与 Visual Studio 2017 一起发布 。虽然该版本继承和发展了C# 6.0,但不包含编译器即服务 。
一、out 变量以前我们使用out变量必须在使用前进行声明,C# 7.0给我们提供了一种更简洁的语法 “使用时进行内联声明”。如下所示:
var input = ReadLine();if (int.TryParse(input, out var num))//可直接写明变量的类型也可以写隐式类型,因为out关键字修饰的一定是局部变量{WriteLine("您输入的数字是:{0}",num);}所谓的 “内联声明” 编译后就是以前的原始写法,只是现在由编译器来完成 。即编译后为:
int num;//提前声明string s = Console.ReadLine();if (int.TryParse(s, out num)){Console.WriteLine("您输入的数字是:{0}", num);}二、值元组(ValueTuple)使用元组语法,可以在一个语句中分配多个不同类型的变量 。以下是几种常用的写法:
//声明命名项元组并为其分配元组值,再按名称访问元组项(string Name, string Capital, double GdpPerCapita) countryInfo = ("Malawi", "Lilongwe", 226.50);System.Console.WriteLine($@"The poorest country in the world in 2017 was {countryInfo.Name}, {countryInfo.Capital}: {countryInfo.GdpPerCapita}");//将元组分配到各个已声明且使用分布式语法进行隐式类型化的变量中var (country, capital, gdpPerCapita) = ("Malawi", "Lilongwe", 226.50);System.Console.WriteLine($@"The poorest country in the world in 2017 was {country}, {capital}: {gdpPerCapita}");//将命名项元组分配到一个隐式类型化变量中,再按名称访问元组项var countryInfo = (Name:"Malawi", Capital:"Lilongwe", GdpPerCapita:226.50);System.Console.WriteLine($@"The poorest country in the world in 2017 was {countryInfo.Name}, {countryInfo.Capital}: {countryInfo.GdpPerCapita}");//将未命名的元组分配到一个隐式类型化变量中,再按 Item-number 属性访问元组元素var countryInfo = ("Malawi", "Lilongwe", 226.50);System.Console.WriteLine($@"The poorest country in the world in 2017 was {countryInfo.Item1}, {countryInfo.Item2}: {countryInfo.Item3}");//使用下划线放弃相应的元组部分(string name, _, double gdpPerCapita) countryInfo = ("Malawi", "Lilongwe", 226.50);元组是用于将数据封装到一个对象的轻型解决方案,就像用袋子将从商店购买的杂项物品装在一起一样 。
与数组不同,元组包含的项数据类型可以不同,几乎不受任何限制(尽管不允许使用指针),但需要由代码标识,且不能在运行时更改,这两点限制除外 。
此外,不同于数组的是,编译时也会对元组内的项数量进行硬编码 。
另外,元组(Tuple)在 .Net 4.0 的时候就有了,值元组(ValueTuple)的出现,弥补了老版的两个缺点:
??1)ValueTuple 支持语义上的字段命名 。舍弃仅按照顺序取值(Item1,Item2...),增强了可读性 。
??2)ValueTuple 是值类型(Struct) 。舍弃原来的引用类型,更为轻量化 。
三、析构元组和其他类型在 C# 7.0 及更高版本中,用户可从元组中检索多个元素,或者在单个析构操作中从对象检索多个字段值、属性值和计算值 。若要析构元组,可将其元素分配给各个变量 。析构对象时,将选定值分配给各个变量 。
原来的做法是:一旦检索到元组,就必须处理它的各个元素 。按元素逐个操作比较麻烦,如下例所示 。 QueryCityData 方法返回一个三元组,并通过单独的操作将其每个元素分配给一个变量 。
public class Example{public static void Main(){var result = QueryCityData("New York City"); // 返回全部字段var city = result.Item1; // 再逐个赋值var pop = result.Item2;var size = result.Item3;}private static (string, int, double) QueryCityData(string name){if (name == "New York City")return (name, 8175133, 468.48);return ("", 0, 0);}}

经验总结扩展阅读