C#中使用 record 的好处 因为好用所以推荐~
一晃距C# 9发布已经4年了,对于record关键字想必大家都不陌生了,不过呢发现还是有很多同学不屑于使用这个语法糖,确实,本质上record就是class的封装,能用 record 书写的类,那100%都是可以自己手撸出来的,但是呢有没有考虑 别人可能一分钟写好的代码你可能会需要数分钟才能完成.因此为了能有更多时间摸鱼,强烈推荐 那些不屑的同学也能用起来!
下面我简略聊一聊 record 的好处和最佳场景:
- 简化语法
我们只需要一行代码就可以定义完成,这个是最直观节省编码的方式,我们不需要编写一堆枯燥的get;set,也不需要编写构造函数等样板代码:
public record Person(string FirstName, string LastName);
那么有同学会有疑问,如果Person有很多的属性咋整,不就意味着主构造函数会很冗长,其实呢,这个和封装传参的方式是一样的,我们可以把同质的属性封装成其他的record或者class,比如:
public record ExtraInfomation(string Address,string Email,int Age);
public record Person(string FirstName, string LastName, ExtraInfomation ExtraInfo);
- 自动生成一些对我们有用的成员函数.
- 构造函数:根据定义的属性自动生成构造函数。
- 属性:自动生成只读属性。
- Deconstruct 方法:用于解构记录对象,对于习惯写
TS的小伙伴相当友好。 - Equals 和 GetHashCode 方法:基于属性值的相等性比较。
- ToString 方法:提供友好的字符串表示,对于调试输出特别友好。
- 基于值的相等性语法.
我们很多时候有这种需求就是比较一个类的所有属性来判断逻辑.如果使用 record 的话 我们只需要==或者Equals就能判断,
- 非破坏性复制值
对于一个class的浅表复制,我们可能需要实现ICloneable,亦或者new一个对象逐个属性赋值,当然还有其他的方法,但是呢肯定是没有 record 来的这么简单直接.我们仅需要一个with关键字就干完了
public record Person(string FirstName, string LastName, int Age);
var person1 = new Person("vip", "wan", 18);
var person2 = person1 with { Age = 31 };
Console.WriteLine(person1); // 输出: Person { FirstName = vip, LastName = wan, Age = 30 }
Console.WriteLine(person2); // 输出: Person { FirstName = vip, LastName = wan, Age = 31 }
- 解构的支持
record 类型自动生成 Deconstruct 方法,允许你轻松地解构记录对象,对于全栈的同学书写就是手到擒来!
var person = new Person("vip", "wan", 18);
var (firstName, lastName, age) = person;
Console.WriteLine(firstName); // 输出: vip
Console.WriteLine(lastName); // 输出: wan
Console.WriteLine(age); // 输出: 18
- 填充既有类
嗯当前 C# 语言是真的突飞猛进,年底就要发布C# 13了,小伙伴们都直呼学不动了!,当然也有同学肯定也尝鲜了主构造函数了吧, 如果相对主构造函数进一步了解可以 点击链接 对于注入的服务又能少撸不少的代码!
那么既然class都有了主构造函数,是不是意味着record就失去意义了呢?!,嗯?!你忘了上面的那些糖的甜度了吗?
因此我们如果需要对既有的class支持到 record 的特性我们只需要在class前加上 record 即可.
public record class User {
public string UserName{ get; set;}
public int Age { get; set;}
}
var user1 = new User { UserName = "vipwan" , Age = 18};
var user2 = user1 with { };
var user3 = user1 with { Age = 30 };
user1 == user2 // true;
user3.ToString() // "User { Name = vipwan, Age = 30 }"
总结
使用 record 类型的主要好处包括简洁的语法、自动生成的成员、基于值的相等性、非破坏性复制、解构支持、继承支持和与模式匹配的良好集成。这些特性使得 record 类型非常适合用于不可变数据对象(DTO,VO等),提高了代码的可读性、可维护性和开发效率。
C#中使用 record 的好处 因为好用所以推荐~的更多相关文章
- C语言中使用静态函数的好处
C语言中使用静态函数的好处: 静态函数会被自动分配在一个一直使用的存储区,直到退出应用程序实例,避免了调用函数时压栈出栈,速度快很多. ???(对这个不是很理解)其实我觉得上面这种说法是错误的,它的主 ...
- 控制反转和spring在项目中可以带来的好处
Spring实例化Bean的三种方式分别是: 1,xml配置使用bean的类构造器 <bean id="personService" class="cn.servi ...
- Erlang中的record与宏
http://www.cnblogs.com/me-sa/archive/2011/07/20/erlang0006.html 在Erlang中使用Tuple ,数据项的顺序\数量都是确定的,一旦数据 ...
- 在SSH框架中使用Spring的好处
在SSH框假中spring充当了管理容器的角色.我们都知道Hibernate用来做持久层,因为它将JDBC做了一个良好的封装,程序员在与数据库进行交互时可以不用书写大量的SQL语句.Struts是用来 ...
- 在SSH框架中使用Spring的好处(转)
以下是我总结下今天笔试中SSh中的总结: 在SSH框架中spring充当了管理容器的角色.我们都知道Hibernate用来做持久层,因为它将JDBC做了一个良好的封装,程序员在与数据库进行交互时可以不 ...
- 在 React 中使用 JSX 的好处
优点: 1.允许使用熟悉的语法来定义 HTML 元素树: 2.提供更加语义化且移动的标签: 3.程序结构更容易被直观化: 4.抽象了 React Element 的创建过程: 5.可以随时掌控 HTM ...
- 分布式SQL数据库中部分索引的好处
在优锐课的java学习分享中,探讨了分布式SQL数据库中部分索引的优势,并探讨了性能测试,结果等. 如果使用局部索引而不是常规索引,则在可为空的列上(其中只有一小部分行的该列不具有空值),然后可以大大 ...
- pl/sql中的record用法
create or replace procedure pro1(v_in_empno in number) is --定义一个记录数据类型 type my_emp_record is record( ...
- javascript中“use strict”的好处和坏处
1.为什么使用严格模式? 消除javascript语法的一些不合理.不严谨之处,减少一些怪异行为: 消除代码运行的不安全之处,保证代码的运行: 提高编译效率,增加运行效率: 为未来新版本的javasc ...
- 使用.NET Core中创建Windows服务(一) - 使用官方推荐方式
原文:Creating Windows Services In .NET Core – Part 1 – The "Microsoft" Way 作者:Dotnet Core Tu ...
随机推荐
- 从xib初始化的UIView如何继承?
一.如何从xib自定义一个CustomView 1)首先创建继承自UIView的子类CustomView 2)创建名字为CustomView的View的Interface文件 3)在xib的资源文件中 ...
- OOP课第二阶段总结
OOP课第二阶段总结 前言 作为第二次3+1的总结,明显感受到了此次题目集越来越复杂,结合了实际的物理知识来解决现实中的电路问题.因为电路可以一直扩展下去,情况千变万化,难以像上次题目集一样找到一个呆 ...
- uniapp 上拉加载下拉刷新
page.json中配置"enablePullDownRefresh": true //单个页面修改刷新按钮的颜色 "app-plus": { "ti ...
- ES6 ES6变量的声明
// ES6语法 // 是对js影响最大的一个版本更新 // 在 ES6 语法中 退出了很多新的 语法结构 // 就相当于 js 语言, 换了一个新 ...
- 【Java面试题-基础知识02】Java抽象类和接口六连问?
1.抽象类和接口分别是什么? 抽象类是一种类,可以包含抽象方法和非抽象方法,抽象方法是没有具体实现的方法,需要在子类中被具体实现. 接口是一种完全抽象的类,其中的所有方法都是抽象方法,没有方法体,它只 ...
- P7897
problem && blog 第一道正经的 Ynoi,特此写篇题解纪念一下. Algorithm 1 可以想到 \(O(nm)\) 的 DP. 我们定义 \(dp_u\) 为 \(u ...
- C#.NET 使用Task.Run和Task.Delay 延时执行任务(代码)
C#.NET 使用Task.Run和Task.Delay 延时执行任务(代码) 环境: .NET 4.5.2 .NET WEB MVC + WEB API. 示例代码: using CommonUti ...
- java开发规范 RestController Apollo logger params T data NPE page
java开发规范 1.@Valid @RequestBody MyAppWorkOrderRequestVO orderRemarkListRequestVO 缺少 @RequestBody 注解,否 ...
- CSS3随机背景图片切换特效
Tips:当你看到这个提示的时候,说明当前的文章是由原emlog博客系统搬迁至此的,文章发布时间已过于久远,编排和内容不一定完整,还请谅解` CSS3随机背景图片切换特效 日期:2018-5-16 阿 ...
- 测试网络的小工具WinMTR
ping网络的小工具 搜集了两个版本中文版和英文版 中文版---- WinMTR中文版.rarhttps://www.aliyundrive.com/s/bZqmokL5dTt提取码: k6v7 英文 ...