当前位置: 首页 > 科技观察

你了解C#中的解构吗?

时间:2023-03-13 14:01:13 科技观察

本文转载自微信公众号《精致码农》,作者liamwang。转载本文请联系精美码农公众号。解构是将对象分解成多个部分并将它们存储到新变量中。在C#中,解构是一种方便的方式,可以将一个对象的多个成员的值一次性存储到多个变量中。1.解构元组元组为方法返回多个值提供了便利,而无需创建额外的类型来承载返回值。例如,下面的方法使用元组返回两个值:publicstatic(string,string,int)GetPerson(){varfirstName="Liam";varlastName="Wang";varage=18;return(firstName,lastName,age);}为了检索该方法返回的元组的成员,如果我们不使用解构,我们可能需要这样写:varperson=GetPerson();varfirstName=person.Item1;varlastName=person.Item2;varage=person.Item3;使用解构,然后可以一次性将元组的每个成员赋给不同的变量,可以这样写:(stringfirstName,stringlastName,intage)=GetPerson();//firstName="Liam"//lastName="Wang"//age=18也可以使用var自动推断每个变量的类型:var(firstName,lastName,age)=GetPerson();//firstName="Liam"//lastName="Wang"//age=18元组的解构是根据成员的位置顺序,即Item1赋值给第一个变量,Item2赋值给第二个变量...。但是,一旦使用解构检索元组,就必须处理它的各个成员。我们可以使用Discard(_)来处理我们不关心的成员,只得到元组中我们需要的部分成员。例如:var(firstName,_,_)=GetPerson();//firstName="Liam"2.解构类我们还可以解构类并访问特定字段,如元组。但是为了实现这一点,我们需要在类中添加一个Deconstruct()方法,例如:outstringlastName,outintage){firstName=FirstName;lastName=LastName;age=Age;}}然后可以像元组对象一样被解构:varperson=newPerson{FirstName="Liam",LastName="Liam",Age=18};var(名字,姓氏,年龄)=人;或者只关心一些成员:...var(firstName,_,_)=person;Deconstruct()方法允许重载,例如:...publicvoidDeconstruct(outstringfirstName,outstringlastName)=>(firstName,lastName)=(FirstName,LastName);publicvoidDeconstruct(outstringfirstName,outstringlastName,outintage)=>(firstName,lastName,age)=(名字,姓氏,年龄);解构时会根据声明的变量个数调用相应的Deconstruct()方法。...var(firstName,lastName)=person;var(firstName,lastName,age)=person;也可以通过静态扩展方法在类的实例中添加Deconstruct()方法,例如:=person.Age;}}3.解构记录C#9的记录类型与元组相同,可以直接按照成员的顺序解构。例如:recordPerson(stringFirstName,stringLastName,intage);staticvoidMain(string[]args){varperson=newPerson("Liam","Wang",18);var(firstName,lastName,age)=person;}//firstName="Liam"//lastName="Wang"//age=18记录类型可以像类一样有命名成员,也可以像元组一样有基于成员顺序的可解构特性。不需要单独定义Deconstruct()方法。