首页 > 编程语言 >C#中使用 record 的好处 因为好用所以推荐~

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

时间:2024-07-26 15:39:36浏览次数:9  
标签:string Person C# Age public record 好用 构造函数

一晃距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 = 31 };
Console.WriteLine(person1); // 输出: Person { FirstName = vip, LastName = wan, Age = 30 }
Console.WriteLine(person2); // 输出: Person { FirstName = vip, LastName = wan, Age = 31 }
  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等),提高了代码的可读性可维护性开发效率

标签:string,Person,C#,Age,public,record,好用,构造函数
From: https://www.cnblogs.com/vipwan/p/18325508

相关文章

  • 新电脑如何设置 npm 源及查看源、安装 cnpm、pnpm 和 yarn 的详细教程
    当你获得一台新电脑,或需要在现有电脑上优化JavaScript和Node.js的开发环境时,正确配置npm是一步不可少的过程。本教程将详细指导你如何设置npm源,查看当前源,以及如何安装cnpm、pnpm和yarn。1.设置npm源npm(NodePackageManager)是Node.js的包管理器,通过......
  • 《DNK210使用指南 -CanMV版 V1.0》第十四章 按键输入实验
    第十四章按键输入实验1)实验平台:正点原子DNK210开发板2)章节摘自【正点原子】DNK210使用指南-CanMV版V1.03)购买链接:https://detail.tmall.com/item.htm?&id=7828013987504)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/k210/ATK-DNK210.html5)正点原......
  • @TableLogic导致update失效
    前言1.为什么要使用TableLogic?(1)在某些业务需求场景下,删除数据需要采用逻辑删除而不是物理删除(2)方便以后数据审计、历史数据的分析、保证多表数据的完整性然而,这一功能在某些情况下会导致更新操作失效。本文将详细讨论@TableLogic如何影响更新操作,并提供相应的解......
  • python requests 报错 Caused by ProxyError ('Unable to connect to proxy', OSError
    背景:访问https接口,使用http代理版本:requests:2.31.0 从报错可以看出,是proxy相关的报错调整代码,设定不使用代理,将http与https对应的proxy值置空即可(尝试过proxies={},但此写法不生效)proxies={'http':'','https':''}response = requests.get('https://xxx......
  • Leetcode 1334 Find the City With the Smallest Number of Neighbors at a Threshold
    Problem:FindtheCityWiththeSmallestNumberofNeighborsataThresholdDistanceTheknowledgepointsoutsideofmyskilltreeExplanationofCodeandConceptsWhatisfloat('inf')?float('inf')inPythonrepresentspositiveinfin......
  • OpenAI深夜发布 SearchGPT:进军大模型搜索领域,挑战谷歌与 Perplexity!
    近期,AI领域竞争愈发激烈,不仅大模型发布频繁,还不断带来新的产品体验。刚刚,OpenAI正式发布了其大模型搜索产品SearchGPT。链接:https://chatgpt.com/searchSamAltman在X上表示:“我们认为搜索功能还有改进的空间。我们推出了一个名为SearchGPT的新原型产品。我......
  • Dynamsoft Barcode Reader SDK Android Package 10.2.11
    BarcodeScannerforMobileIntegraterobustscanningcapabilitiesforQRcodeandotherbarcodetypesintoyournativeiOSandAndroidapps.DynamsoftBarcodeReaderSDKAndroidPackage10.2.11-Milli-SecondSpeedforMobileVideoStreamsUnderinteractive......
  • crontab在java-spring中的语法规则
      秒分钟小时日月周年每******** 每秒每分每时每天每月每周每年区间;从a-b-a-ba-ba-ba-ba-ba-ba-b 从a秒到b秒从a分到b分从a点到b点从a号到......
  • CBR云备份与恢复管控简介
    本文分享自天翼云开发者社区《CBR云备份与恢复管控简介》,作者:c****n1.CBR云备份与恢复介绍CBR(CloudBackup&Restore)是一般云厂商提供的备份与恢复服务。用户可以在云端对数据进行备份和恢复,保证数据的安全性和可靠性。使用CBR,用户可以方便地随时随地备份和恢复数据。采用......
  • Linux系统(在线)安装、卸载docker环境
    一安装1安装需要的软件包yum-util提供yum-config-manager功能,另外两个是devicemapper驱动依赖的sudoyuminstall-yyum-utilsdevice-mapper-persistent-datalvm22设置yum源sudoyum-config-manager--add-repohttps://download.docker.com/linux/centos/docker-ce.re......