首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

C#中使用 record 的好处 因为好用所以推荐~

编程知识
2024年07月26日 14:40

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

下面我简略聊一聊 record 的好处和最佳场景:

  1. 简化语法

我们只需要一行代码就可以定义完成,这个是最直观节省编码的方式,我们不需要编写一堆枯燥的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);
  1. 自动生成一些对我们有用的成员函数.
  • 构造函数:根据定义的属性自动生成构造函数。
  • 属性:自动生成只读属性。
  • Deconstruct 方法:用于解构记录对象,对于习惯写TS的小伙伴相当友好。
  • Equals 和 GetHashCode 方法:基于属性值的相等性比较。
  • ToString 方法:提供友好的字符串表示,对于调试输出特别友好。
  1. 基于值的相等性语法.

我们很多时候有这种需求就是比较一个类的所有属性来判断逻辑.如果使用 record 的话 我们只需要==或者Equals就能判断,

  1. 非破坏性复制值

对于一个 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 = 30 };
Console.WriteLine(person1); // 输出: Person { FirstName = vip, LastName = wan, Age = 18 }
Console.WriteLine(person2); // 输出: Person { FirstName = vip, LastName = wan, Age = 30 }
  1. 解构的支持

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
  1. 结合模式匹配

record 类型与模式匹配功能很好地集成在一起,使得在模式匹配中使用记录对象更加方便。

public record Person(string UserName, int Age);
public string GetPersonInfo(Person person) => person switch
{
    { Age: < 18 } => "Minor",
    { Age: >= 18 } => "Adult",
    _ => "Unknown"
};
  1. 填充既有类

嗯当前 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等),提高了代码的可读性可维护性开发效率

From:https://www.cnblogs.com/vipwan/p/18325508
本文地址: http://www.shuzixingkong.net/article/459
0评论
提交 加载更多评论
其他文章 前端性能优化实践方向与方法
0x01 代码优化与压缩 (1)HTML 移除不必要的空白字符、注释和冗余标签,以减少文件大小 使用命令 npm install html-minifier -g 安装 HTML Minifier 使用命令 html-minifier -V 确认安装成功 在 Node.js 环境中配置 index.
前端性能优化实践方向与方法
ComfyUI插件:IPAdapter_plus(新版)节点
ComfyUI插件:IPAdapter_plus(新版)节点前言:学习ComfyUI是一场持久战,而IPAdapter_plus是常用且便捷有效的风格迁移模型,可以通过提供参考图像去进行图像的生成,比如风格迁移,风格融合,人物脸部模拟等各种工作,请大家重点关注本篇内容,深刻理解节点用法!!祝大家学习
ComfyUI插件:IPAdapter_plus(新版)节点 ComfyUI插件:IPAdapter_plus(新版)节点 ComfyUI插件:IPAdapter_plus(新版)节点
缓存框架 Caffeine 的可视化探索与实践
Caffeine作为一个高性能的缓存框架而被大量使用。本文基于Caffeine已有的基础进行定制化开发实现可视化功能。
缓存框架 Caffeine 的可视化探索与实践 缓存框架 Caffeine 的可视化探索与实践 缓存框架 Caffeine 的可视化探索与实践
一文详解 JuiceFS 读性能:预读、预取、缓存、FUSE 和对象存储
在高性能计算场景中,往往采用全闪存架构和内核态并行文件系统,以满足性能要求。随着数据规模的增加和分布式系统集群规模的增加,全闪存的高成本和内核客户端的运维复杂性成为主要挑战。 JuiceFS,是一款全用户态的云原生分布式文件系统,通过分布式缓存大幅提升 I/O 吞吐量,并使用成本较低的对象存储来完成
一文详解 JuiceFS 读性能:预读、预取、缓存、FUSE 和对象存储 一文详解 JuiceFS 读性能:预读、预取、缓存、FUSE 和对象存储 一文详解 JuiceFS 读性能:预读、预取、缓存、FUSE 和对象存储
《最新出炉》系列入门篇-Python+Playwright自动化测试-54- 上传文件(input控件) - 上篇
1.简介 在实际工作中,我们进行web自动化的时候,文件上传是很常见的操作,例如上传用户头像,上传身份证信息等。所以宏哥打算按上传文件的分类对其进行一下讲解和分享。 2.上传文件的API(input控件) Playwright是一个现代化的自动化测试工具,它支持多种浏览器和操作系统,可以帮助开发人员
《最新出炉》系列入门篇-Python+Playwright自动化测试-54- 上传文件(input控件) - 上篇 《最新出炉》系列入门篇-Python+Playwright自动化测试-54- 上传文件(input控件) - 上篇 《最新出炉》系列入门篇-Python+Playwright自动化测试-54- 上传文件(input控件) - 上篇
空间反演对称性 (Spatial Inversion Symmetry) 和非线性响应 (Non-linear Response)
我们定义一次宇称变换 (parity transformation) 为反转所有坐标: \[\mathcal{P}: \begin{pmatrix} x \\ y \\ z \end{pmatrix} \rightarrow \begin{pmatrix} -x \\ -y \\ -z \end{p
空间反演对称性 (Spatial Inversion Symmetry) 和非线性响应 (Non-linear Response) 空间反演对称性 (Spatial Inversion Symmetry) 和非线性响应 (Non-linear Response) 空间反演对称性 (Spatial Inversion Symmetry) 和非线性响应 (Non-linear Response)
Jetpack Compose学习(12)——Material Theme的主题色切换
原文:Jetpack Compose学习(12)——Material Theme的主题色切换-Stars-One的杂货小窝 闲着无事研究了下Jetpack Compose M3 主题切换效果 本系列以往文章请查看此分类链接Jetpack compose学习 如何生成主题 首先,我们需要知道的是,M3
Jetpack Compose学习(12)——Material Theme的主题色切换 Jetpack Compose学习(12)——Material Theme的主题色切换 Jetpack Compose学习(12)——Material Theme的主题色切换
【工具】IDEA怎么查看maven依赖链路?
当我在SpringBoot项目中想加个依赖,但是不确定现有依赖的依赖的依赖.....有没有添加过这个依赖,怎么办呢?如果添加过了但是不知道我需要的这个依赖属于哪个依赖的下面,怎么查呢? IDEA中提供了很方便的视图可以满足我们的需求 第一步点击项目右侧的maven 第二步选中Dependencies
【工具】IDEA怎么查看maven依赖链路? 【工具】IDEA怎么查看maven依赖链路? 【工具】IDEA怎么查看maven依赖链路?