以前我们使用out变量必须在使用前进行声明,C# 7.0 给我们提供了一种更简洁的语法 “使用时进行内联声明” 。如下所示:
1 var input = ReadLine(); result)) 3 { ,result); 5 } { ); 9 }
上面代码编译后:
1 int num; 2 string s = Console.ReadLine(); 3 if (int.TryParse(s, out num)) 4 { , num); 6 } { ); 10 }
原理解析:所谓的 “内联声明” 编译后就是以前的原始写法,只是现在由编译器来完成。
备注:在进行内联声明时,即可直接写明变量的类型也可以写隐式类型,因为out关键字修饰的一定是局部变量。
2. 元组(Tuples)元组(Tuple)在 .Net 4.0 的时候就有了,但元组也有些缺点,如:
1)Tuple 会影响代码的可读性,因为它的属性名都是:Item1,Item2.. 。
2)Tuple 还不够轻量级,因为它是引用类型(Class)。
备注:上述所指 Tuple 还不够轻量级,是从某种意义上来说的或者是一种假设,即假设分配操作非常的多。
C# 7 中的元组(ValueTuple)解决了上述两个缺点:
1)ValueTuple 支持语义上的字段命名。
2)ValueTuple 是值类型(Struct)。
1. 如何创建一个元组?
tuple2 = ValueTuple.Create(tuple3 = WriteLine($);
原理解析:上面三种方式最终都是使用 new 运算符来创建实例。
2. 如何创建给字段命名的元组?
(int one, int two) tuple = (1, 2); ); tuple2 = (one: 1, two: 2); ); (WriteLine($);
注:左右两边同时指定字段名称,会使用左边的字段名称覆盖右边的字段名称(一一对应)。
原理解析:上述给字段命名的元组在编译后其字段名称还是:Item1, Item2...,即:“命名”只是语义上的命名。
3. 什么是解构?
解构顾名思义就是将整体分解成部分。
4. 解构元组,如下所示:
1 var (one, two) = GetTuple(); );
1 static (int, int) GetTuple() 2 { 3 return (1, 2); 4 }
原理解析:解构元组就是将元组中的字段值赋值给声明的局部变量(编译后可查看)。
备注:在解构时“=”左边能提取变量的数据类型(如上所示),元组中字段类型相同时即可提取具体类型也可以是隐式类型,但元组中字段类型
不相同时只能提取隐式类型。
5. 解构可以应用于 .Net 的任意类型,但需要编写 Deconstruct 方法成员(实例或扩展)。如下所示:
Student 2 { 3 public Student(string name, int age) 4 { 5 Name = name; 6 Age = age; 7 } Name { get; set; } Age { get; set; } Deconstruct( age) 14 { 15 name = Name; 16 age = Age; 17 } 18 }
使用方式如下:
, 30); );
原理解析:编译后就是由其实例调用 Deconstruct 方法,然后给局部变量赋值。
Deconstruct 方法签名:
Deconstruct(out type variable1, out type variable2...) Deconstruct(this type instance, out type variable1, out type variable2...)
总结:1. 元组的原理是利用了成员类型的嵌套或者是说成员类型的递归。2. 编译器很牛B才能提供如此优美的语法。
使用 ValueTuple 则需要导入: Install - Package System.ValueTuple
1. is 表达式(is expressions),如:
GetSum(IEnumerable<object> values) 2 { 3 var sum = 0; 4 if (values == null) return sum; (var item in values) 7 { ) { 10 sum += (short)item; 11 } (item { 14 sum += val; 15 } (item result)) { 18 sum += result; 19 } (item is IEnumerable<object> subList) 21 { 22 sum += GetSum(subList); 23 } 24 } sum; 27 }
使用方法:
1 条件控制语句(obj is type variable) 2 { }
原理解析:此 is 非彼 is ,这个扩展的 is 其实是 as 和 if 的组合。即它先进行 as 转换再进行 if 判断,判断其结果是否为 null,不等于 null 则执行
语句块逻辑,反之不行。由上可知其实C# 7之前我们也可实现类似的功能,只是写法上比较繁琐。
2. switch语句更新(switch statement updates),如: