1 public class Student 2 { 3 public Student(string name, int age) 4 { 5 Name = name; 6 Age = age; 7 } 8 9 public string Name { get; set; }10 11 public int Age { get; set; }12 13 public void Deconstruct(out string name, out int age)14 {15 name = Name;16 age = Age;17 }18 }
使用方式如下:
1 var (Name, Age) = new Student("Mike", 30);2 3 WriteLine($"name:{Name}, age:{Age}");
原理解析:编译后就是由其实例调用 Deconstruct 方法,然后给局部变量赋值。
Deconstruct 方法签名:
1 // 实例签名2 public void Deconstruct(out type variable1, out type variable2...)3 4 // 扩展签名5 public static void Deconstruct(this type instance, out type variable1, out type variable2...)
1 条件控制语句(obj is type variable)2 {3 // Processing...4 }
原理解析:此 is 非彼 is ,这个扩展的 is 其实是 as 和 if 的组合。即它先进行 as 转换再进行 if 判断,判断其结果是否为 null,不等于 null 则执行
语句块逻辑,反之不行。由上可知其实C# 7之前我们也可实现类似的功能,只是写法上比较繁琐。
2. switch语句更新(switch statement updates),如:
1 static int GetSum(IEnumerable values) 2 { 3 var sum = 0; 4 if (values == null) return 0; 5 6 foreach (var item in values) 7 { 8 switch (item) 9 {10 case 0: // 常量模式匹配11 break;12 case short sval: // 类型模式匹配13 sum += sval;14 break;15 case int ival:16 sum += ival;17 break;18 case string str when int.TryParse(str, out var result): // 类型模式匹配 + 条件表达式19 sum += result;20 break;21 case IEnumerable subList when subList.Any():22 sum += GetSum(subList);23 break;24 default:25 throw new InvalidOperationException("未知的类型");26 }27 }28 29 return sum;30 }
使用方法:
1 switch (item) 2 { 3 case type variable1: 4 // processing... 5 break; 6 case type variable2 when predicate: 7 // processing... 8 break; 9 default:10 // processing...11 break;12 }
原理解析:此 switch 非彼 switch,编译后你会发现扩展的 switch 就是 as 、if 、goto 语句的组合体。同 is expressions 一样,以前我们也能实
1 public class Student 2 { 3 private string _name = GetName() ?? throw new ArgumentNullException(nameof(GetName)); 4 5 private int _age; 6 7 public int Age 8 { 9 get => _age;10 set => _age = value <= 0 || value >= 130 ? throw new ArgumentException("参数不合法") : value;11 }12 13 static string GetName() => null;14 }