用户作为类、结构或接口的创建者,可通过实现一个或多个 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!
具有相同数量参数的多个 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");}
经验总结扩展阅读
- AgileBoot - 如何集成内置数据库H2和内置Redis
- 为什么台北和香港可以参加奥运会
- 和平精英撕心裂肺心碎绝望的文案 彼此不再联系的句子
- 两个6寸蛋糕和一个8寸哪个大
- 送礼送3000和5000区别
- 总是会把感动和爱情搞混的星座
- 粘米粉是什么粉和糯米粉的区别
- 沙俄和俄罗斯的区别
- 和爱人同居时,最容易被嫌弃的星座是哪些
- 和这些星座恋爱,什么事都要自己主动