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);}}
用户作为类、结构或接口的创建者,可通过实现一个或多个 Deconstruct
方法来析构该类型的实例 。该方法返回 void , 且要析构的每个值由方法签名中的 out
参数指示 。
新写法示例:重载 Deconstruct
方法以返回 Person
对象的各种属性组合 。
using System;public class Person{public string FirstName { get; set; }public string MiddleName { get; set; }public string LastName { get; set; }public string City { get; set; }public string State { get; set; }//构造函数 , 初始化赋值public Person(string fname, string mname, string lname, string cityName, string stateName){FirstName = fname;MiddleName = mname;LastName = lname;City = cityName;State = stateName;}// 返回名字和姓氏public void Deconstruct(out string fname, out string lname){fname = FirstName;lname = LastName;}// 返回名字、中间名和姓氏public void Deconstruct(out string fname, out string mname, out string lname){fname = FirstName;mname = MiddleName;lname = LastName;}// 返回名字、姓氏、城市、州public void Deconstruct(out string fname, out string lname, out string city, out string state){fname = FirstName;lname = LastName;city = City;state = State;}}public class ExampleClassDeconstruction{public static void Main(){var p = new Person("John", "Quincy", "Adams", "Boston", "MA");//初始化// Deconstruct the person object.var (fName, lName, city, state) = p;//自动调用对应的析构方法Console.WriteLine($"Hello {fName} {lName} of {city}, {state}!");}}// The example displays the following output://Hello John Adams of Boston, MA!
推荐阅读
- AgileBoot - 如何集成内置数据库H2和内置Redis
- 启初和小浣熊面霜哪个好_启初跟小浣熊哪个更好
- 3050和3050ti的差距_3050和3050ti差多少
- 华为nova9和华为nova9pro的区别_华为nova9和华为nova9pro有什么不同
- 荣耀magic3怎么设置指纹解锁_添加指纹解锁步骤
- TCP 序列号和确认号是如何变化的?
- 二 SpringCloud - Eureka注册中心,feign远程调用,hystrix降级和熔断
- 其三 Gitea 1.18 功能前瞻:增强文本预览效果、继续扩展软件包注册中心、增强工单实用功能、完善了用户邀请机制和SEO
- 华为watch3pro尊享版和时尚版区别_哪款更值得入买
- 雅萌ace和max的区别_雅萌ace和max的参数