你了解C#中的解构吗?

本文转载自微信公众号「精致码农」,作者liamwang  。转载本文请联系精致码农公众号。

创新互联建站成都网站建设定制开发,是成都网站维护公司,为生料搅拌车提供网站建设服务,有成熟的网站定制合作流程,提供网站定制设计服务:原型图制作、网站创意设计、前端HTML5制作、后台程序开发等。成都网站建设热线:13518219792

解构是将一个对象分割成若干部分并将其存储到新的变量中。在 C# 中,解构可以方便地一次性将一个对象的多个成员的值存储到多个变量中。

1.解构元组

元组为方法返回多个值提供了便捷,无需创建额外的类型来承载返回的值。例如,下面这个方法使用元组返回两个值:

 
 
 
  1. public static (string, string, int) GetPerson() 
  2.     var firstName = "Liam"; 
  3.     var lastName = "Wang"; 
  4.     var age = 18; 
  5.     return (firstName, lastName, age); 

对于检索这个方法返回元组的各成员,如果不使用解构,我们可能需要这样写:

 
 
 
  1. var person = GetPerson(); 
  2.  
  3. var firstName = person.Item1; 
  4. var lastName = person.Item2; 
  5. var age = person.Item3; 

使用解构,则可以一次性将元组的各成员分别赋值给不同的变量,可以这样写:

 
 
 
  1. (string firstName, string lastName, int age) = GetPerson(); 
  2.  
  3. // firstName = "Liam" 
  4. // lastName = "Wang" 
  5. // age = 18 

也可以使用 var 自动推断各个变量的类型:

 
 
 
  1. var (firstName, lastName, age) = GetPerson(); 
  2.  
  3. // firstName = "Liam" 
  4. // lastName = "Wang" 
  5. // age = 18 

元组的解构是基于成员的位置顺序来的,即将 Item1 赋给第一上变量,将 Item2 赋给第二个变量……。

但是,一旦你使用解构检索元组,你就必须处理它的各个成员。我们可以使用 弃元(_)来处理我们不关心的成员,只获取元组中的我们需要的部分成员。例如:

 
 
 
  1. var (firstName, _, _) = GetPerson(); 
  2.  
  3. // firstName = "Liam" 

2.解构类

我们也可以对类进行解构,并像对元组那样访问特定的字段。但为了实现这个目的,我们需要给类添加一个 Deconstruct() 方法,例如:

 
 
 
  1. public class Person 
  2.     public string FirstName { get; set; } 
  3.     public string LastName { get; set; } 
  4.     public int Age { get; set; } 
  5.  
  6.     public void Deconstruct(out string firstName, out string lastName, out int age) 
  7.     { 
  8.         firstName = FirstName; 
  9.         lastName = LastName; 
  10.         age = Age; 
  11.     } 

然后可以和元组对象一样使用解构:

 
 
 
  1. var person = new Person { FirstName = "Liam", LastName = "Liam", Age = 18 }; 
  2.  
  3. var (firstName, lastName, age) = person; 

或只关心部分成员:

 
 
 
  1. ... 
  2.  
  3. var (firstName, _, _) = person; 

Deconstruct() 方法允许重载,比如:

 
 
 
  1. ... 
  2.  
  3. public void Deconstruct(out string firstName, out string lastName) => 
  4.     (firstName, lastName) = (FirstName, LastName); 
  5.  
  6. public void Deconstruct(out string firstName, out string lastName, out int age) => 
  7.     (firstName, lastName, age) = (FirstName, LastName, Age); 

它会根据解构时的声明的变量数调用对应的 Deconstruct() 方法。

 
 
 
  1. ... 
  2.  
  3. var (firstName, lastName) = person; 
  4.  
  5. var (firstName, lastName, age) = person; 

也可以通过静态扩展方法的方式给类的实例添加 Deconstruct() 方法,比如:

 
 
 
  1. public static class PersonExtensions 
  2.     public static void Deconstruct(this Person person, 
  3.       out string firstName, out string lastName, out int age) 
  4.     { 
  5.         firstName = person.FirstName; 
  6.         lastName = person.LastName; 
  7.         age = person.Age; 
  8.     } 

3.解构记录

C# 9 的记录(Record)类型和元组一样,可以根据成员顺序直接解构。例如:

 
 
 
  1. record Person(string FirstName, string LastName, int age); 
  2.  
  3. static void Main(string[] args) 
  4.     var person = new Person("Liam", "Wang", 18); 
  5.  
  6.     var (firstName, lastName, age) = person; 
  7.  
  8. // firstName = "Liam" 
  9. // lastName = "Wang" 
  10. // age = 18 

 记录类型既可以和类一样有具名成员,也可以和元组一样有基于成员顺序的可解构特性,不需要单独定义 Deconstruct() 方法。

分享标题:你了解C#中的解构吗?
URL分享:http://www.shufengxianlan.com/qtweb/news20/81520.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联