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

具有相同数量参数的多个 Deconstruct 方法是不明确的 。在定义 Deconstruct 方法时,必须小心使用不同数量的参数 。在重载解析过程中,不能区分具有相同数量参数的 Deconstruct 方法 。
四、析构函数区别于构造函数,构造函数又叫构造方法,它是一种特殊的成员函数,它主要用于为对象分配存储空间,对数据成员进行初始化,也就是就是对类进行初始化 。
析构函数是实现销毁一个类的实例的方法成员 。析构函数不能有参数,不能任何修饰符而且不能被调用 。
由于析构函数的目的与构造函数的相反,就以相同的名字然后加前缀 ~ 以示区别 。语法如下:
public class ResourceHolder{~ResourceHolder(){// 这里是清理非托管资源的用户代码段}}虽然 C#(更确切的说是 CLR)提供了一种新的内存管理机制——自动内存管理机制,资源的释放是可以通过“垃圾回收器” 自动完成的,一般不需要用户干预,但在有些特殊情况下还是需要用到析构函数的,如在 C# 中非托管资源的释放 。
构造函数与析构函数虽然是一个类中形式上较简单的函数,但它们的使用决非看上去那么简单,因此灵活而正确的使用构造函数与析构函数能够更好的管理系统中的资源 。
五、模式匹配“模式匹配”是一种测试表达式是否具有特定特征的方法 。C# 模式匹配提供更简洁的语法,用于测试表达式并在表达式匹配时采取措施 。
is表达式”目前支持通过模式匹配测试表达式并有条件地声明该表达式结果 。
switch表达式”允许你根据表达式的首次匹配模式执行操作 。这两个表达式支持丰富的模式词汇 。
// is 声明模式,用于 测试变量类型 并将其分配给 新变量int? maybe = 12;if (maybe is int number)Console.WriteLine($"The nullable int 'maybe' has the value {number}");elseConsole.WriteLine("The nullable int 'maybe' doesn't hold a value");// is 常数模式,将变量与 null 进行比较,not 为一种逻辑模式,在否定模式不匹配时与该模式匹配string? message = "This is not the null string";if (message is not null){Console.WriteLine(message);}// is 测试变量是否与给定类型匹配public static T MidPoint<T>(IEnumerable<T> sequence){if (sequence is IList<T> list)return list[list.Count / 2];else if (sequence is null)throw new ArgumentNullException(nameof(sequence), "Sequence can't be null.");else{int halfLength = sequence.Count() / 2 - 1;if (halfLength < 0) halfLength = 0;return sequence.Skip(halfLength).First();}}// switch 测试变量(枚举、常量...)找到特定值的匹配项,如下是通过枚举类型public State PerformOperation(Operation command) =>command switch{Operation.SystemTest => RunDiagnostics(),Operation.Start => StartSystem(),Operation.Stop => StopSystem(),Operation.Reset => ResetToReady(),_ => throw new ArgumentException("Invalid enum value for command", nameof(command)),//最终 _ 案例为与所有数值匹配的弃元模式};// switch 使用关系模式测试如何将数值与常量进行比较string WaterState2(int tempInFahrenheit) =>tempInFahrenheit switch{< 32 => "solid",32 => "solid/liquid transition",< 212 => "liquid",212 => "liquid / gas transition",_ => "gas",//最终 _ 案例为与所有数值匹配的弃元模式};// switch 检查一个对象的多个属性的模式public decimal CalculateDiscount(Order order) =>order switch{{ Items: > 10, Cost: > 1000.00m } => 0.10m,// ( > 10,> 1000.00m) => 0.10m, // 等效 写法// 如果 Order 类型定义了适当的 Deconstruct 方法,则可以省略模式的属性名称,并使用析构检查属性{ Items: > 5, Cost: > 500.00m } => 0.05m,{ Cost: > 250.00m } => 0.02m,null => throw new ArgumentNullException(nameof(order), "Can't calculate discount on null order"),var someObject => 0m,};// is 使用列表模式检查列表或数组中的元素public void MatchElements(int[] array){if (array is [0,1]) // 属于二进制数字Console.WriteLine("Binary Digits");else if (array is [1,1,2,3,5,8, ..])// 属于斐波那契数列Console.WriteLine("array looks like a Fibonacci sequence");else //数列无法识别Console.WriteLine("Array shape not recognized");}六、本地函数本地函数是一种嵌套在另一成员中的类型的私有方法 。仅能从其包含成员中调用它们 。
可以声明和调用本地函数的地方:
??方法(尤其是迭代器方法和异步方法)、构造函数、属性访问器、事件访问器、匿名方法、Lambda 表达式、终结器、其他本地函数等 。
以下示例定义了一个名为 AppendPathSeparator 的本地函数,该函数对于名为 

推荐阅读