C#中使用 record 的利益 由于好用以是推荐~

一给  金牌会员 | 2024-7-26 19:55:41 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 847|帖子 847|积分 2541

一晃距C# 9发布已经4年了,对于record关键字想必大家都不陌生了,不过呢发现还是有许多同学不屑于使用这个语法糖,确实,本质上 record 就是 class 的封装,能用 record 誊写的类,那100%都是可以自己手撸出来的,但是呢有没有考虑 别人可能一分钟写好的代码你可能会须要数分钟才能完成.因此为了能有更多时间摸鱼,强烈推荐不屑一顾的同学也能用起来!
下面我大略聊一聊 record 的利益和最佳场景:

  • 简化语法
我们只须要一行代码就可以定义完成,这个是最直观节省编码的方式,我们不须要编写一堆枯燥的get;set; 也不须要编写构造函数等样板代码:
  1. public record Person(string FirstName, string LastName);
复制代码
那么有同学会有疑问,如果Person有许多的属性咋整,不就意味着主构造函数会很冗长,其实呢,这个和封装传参的方式是一样的,我们可以把同质的属性封装成其他的record或者class,好比:
  1. public record ExtraInfomation(string Address,string Email,int Age);
  2. public record Person(string FirstName, string LastName, ExtraInfomation ExtraInfo);
复制代码

  • 自动生成一些对我们有用的成员函数.


  • 构造函数:根据定义的属性自动生成构造函数。
  • 属性:自动生成只读属性。
  • Deconstruct 方法:用于解构记录对象,对于风俗写TS的小伙伴相当友好。
  • Equals 和 GetHashCode 方法:基于属性值的相等性比力。
  • ToString 方法:提供友好的字符串表示,对于调试输出特别友好。

  • 基于值的相等性语法.
我们许多时候有这种需求就是比力一个类的所有属性来判定逻辑.如果使用 record 的话 我们只须要==或者Equals就能判定,

  • 非粉碎性复制值
对于一个 class 的浅表复制,我们可能须要实现ICloneable,亦或者 new 一个对象逐个属性赋值,当然还有其他的方法,但是呢肯定是没有 record 来的这么简单直接.我们仅须要一个with关键字就干完了
  1. public record Person(string FirstName, string LastName, int Age);
  2. var person1 = new Person("vip", "wan", 18);
  3. var person2 = person1 with { Age = 30 };
  4. Console.WriteLine(person1); // 输出: Person { FirstName = vip, LastName = wan, Age = 18 }
  5. Console.WriteLine(person2); // 输出: Person { FirstName = vip, LastName = wan, Age = 30 }
复制代码

  • 解构的支持
record 类型自动生成 Deconstruct 方法,答应你轻松地解构 record 对象,对于全栈的同学誊写就是手到擒来!
  1. var person = new Person("vip", "wan", 18);
  2. var (firstName, lastName, age) = person;
  3. Console.WriteLine(firstName); // 输出: vip
  4. Console.WriteLine(lastName);  // 输出: wan
  5. Console.WriteLine(age);       // 输出: 18
复制代码

  • 结合模式匹配
record 类型与模式匹配功能很好地集成在一起,使得在模式匹配中使用 record 对象更加方便。
  1. public record Person(string UserName, int Age);
  2. public string GetPersonInfo(Person person) => person switch
  3. {
  4.     { Age: < 18 } => "Minor",
  5.     { Age: >= 18 } => "Adult",
  6.     _ => "Unknown"
  7. };
复制代码

  • 填充既有类
嗯当前 C# 语言是真的突飞猛进,年底就要发布C# 13了,小伙伴们都直呼学不动了!,当然也有同学肯定也尝鲜了主构造函数了吧, 如果想要对主构造函数进一步相识可以 点击链接 对于注入的服务又能少撸不少的代码!
那么既然 class 都有了主构造函数,是不是意味着 record 就失去意义了呢?!,嗯?!你忘了上面的那些糖的甜度了吗?
因此我们如果须要对既有的 class 支持到 record 的特性我们只须要在class前加上 record 即可.
  1. public record class User {
  2.   public string UserName{ get; set;}
  3.   public int Age { get; set;}
  4. }
  5. var user1 = new User { UserName = "vipwan" , Age = 18};
  6. var user2 = user1 with { };
  7. var user3 = user1 with { Age = 30 };
  8. user1 == user2 // true;
  9. user3.ToString() // "User { Name = vipwan, Age = 30 }"
复制代码
总结

使用 record 类型的主要利益包罗简便的语法、自动生成的成员、基于值的相等性、非粉碎性复制、解构支持、继承支持和与模式匹配的良好集成。这些特性使得 record 类型非常得当用于不可变数据对象(DTO,VO等),提高了代码的可读性可维护性开发服从

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

一给

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表