Intro
之前我们有介绍过 record 基本知识,record 会实现基于值的类型比较,最近遇到的几个问题觉得用 record 来解决会非常方便,分享一下

基于值的类型比较
最近有遇到一个场景,需要比较两个 JSON 字符串是否相等,字符串比较简单,就是一个固定值的 Dictionary,或者认为它就是一个简单的 Model,但是 JSON 字符串的的属性顺序可能不同,比如说下面的这个示例:

{“Id”:1, “Name”:“Tom”}, {“Name”:“Tom”, “Id”:1},这两个字符串从字符串上来说顺序不同,自然不相等,但是对应的属性的值是相同的,怎么比较方便的进行比较呢,使用 record 可以比较方便进行比较,来看代码:

record Person(int Id, string Name);[Fact]
public void RecordTest()
{var str1 = "{\"Id\":1, \"Name\":\"Tom\"}";var p1 = JsonConvert.DeserializeObject<Person>(str1);var str2 = "{\"Name\":\"Tom\",\"Id\":1}";var p2 = JsonConvert.DeserializeObject<Person>(str2);Assert.True(p1 == p2);Assert.Equal(p1, p2);
}

基于值比较的去重
我们有一个 API 有收到反馈说,调用多次返回的结果不同,于是我就想写一段代码调用个一百次看是否会有重复,大致代码如下:

public record Result
{public string Data { get; set;}public int Code { get; set; }
}var i = 100;
var results = new HashSet<Result>();
using var httpClient = new HttpClient();
while(i-- > 0)
{var responseText = await httpClient.GetStringAsync("");var result = JsonConvert.DeserializeObject<Result>(responseText);results.Add(result);
}
Console.WriteLine(results.Count);

因为 record 不仅会重写 Equals 方法还会重写 GetHashCode 方法,所以可以使用 HashSet 或者 Dictionary 来实现去重

对象克隆
record 提供了 with 表达式来方便的克隆一个新的对象,所以在需要克隆的时候可以考虑使用 record,另外所有原型模式的地方都可以考虑使用 record 来实现

之前我实现了一个简单的日志框架,有一个日志对象,定义如下:

public class LogHelperLoggingEvent : ICloneable
{public string CategoryName { get; set; }public DateTimeOffset DateTime { get; set; }public string MessageTemplate { get; set; }public string Message { get; set; }public LogHelperLogLevel LogLevel { get; set; }public Dictionary<string, object> Properties { get; set; }public LogHelperLoggingEvent Copy() {var newEvent = new LogHelperLoggingEvent(){CategoryName = CategoryName,DateTime = DateTime,MessageTemplate = MessageTemplate,Message = Message,LogLevel = LogLevel};if (Properties != null){newEvent.Properties = new Dictionary<string, object>();foreach (var property in Properties){newEvent.Properties[property.Key] = property.Value;}}return newEvent;}
}

我们可以使用 MemberwiseClone 做一个简化

public class LogHelperLoggingEvent : ICloneable
{public string CategoryName { get; set; }public DateTimeOffset DateTime { get; set; }public string MessageTemplate { get; set; }public string Message { get; set; }public LogHelperLogLevel LogLevel { get; set; }public Dictionary<string, object> Properties { get; set; }public LogHelperLoggingEvent Copy(){var newEvent = (LogHelperLoggingEvent)MemberwiseClone();if (Properties != null){newEvent.Properties = new Dictionary<string, object>();foreach (var property in Properties){newEvent.Properties[property.Key] = property.Value;}}return newEvent;}
}

使用了 record 之后如下,with 表达式返回的是强类型的对象,不再需要自己做强制类型转换了,上面的做法还是比较取巧的办法,使用了 MemberwiseClone 去做复制,如果自己写代码一个一个复制,将会更加繁琐,使用 record 之后就很简单了,只是我们需要注意一下,with 表达式也只是浅复制,如果内部包含复杂引用类型,需要小心使用

public record LogHelperLoggingEvent
{public string CategoryName { get; set; }public DateTimeOffset DateTime { get; set; }public string MessageTemplate { get; set; }public string Message { get; set; }public LogHelperLogLevel LogLevel { get; set; }public Dictionary<string, object> Properties { get; set; }public LogHelperLoggingEvent Copy(){var newEvent = this with{ };if (Properties != null){newEvent.Properties = new Dictionary<string, object>();foreach (var property in Properties){newEvent.Properties[property.Key] = property.Value;}}return newEvent;}
}
public record LogHelperLoggingEvent
{public string CategoryName { get; set; }public DateTimeOffset DateTime { get; set; }public string MessageTemplate { get; set; }public string Message { get; set; }public LogHelperLogLevel LogLevel { get; set; }public Dictionary<string, object> Properties { get; set; }public LogHelperLoggingEvent Copy(){var newEvent = this with{ };if (Properties != null){newEvent.Properties = new Dictionary<string, object>();foreach (var property in Properties){newEvent.Properties[property.Key] = property.Value;}}return newEvent;}
}
More

record 在很多场景下能够简c#教程化我们的代码,使得代码更加干净简洁,在合适的场景下不要忘记使用哦~微软的反向代理项目 YARP 也使用了 record 来简化原来代码中 DeepClone 的功能,可以参考 PR:https://github.com/microsoft/reverse-proxy/pull/662

以上就是c# record的使用场景的详细内容

c# record的使用场景相关推荐

  1. 浅析 record 使用场景

    浅析 record 使用场景 Intro 之前我们有介绍过 record 基本知识,可以参考 C# 9 新特性 - record 解读,record 会实现基于值的类型比较,最近遇到的几个问题觉得用 ...

  2. 判断题:oracle自带的sql语言环境是pl/sql,Oracle之PL/SQL学习笔记之数据类型(三)

    Oracle之PL/SQL学习笔记之数据类型(三) 所有的编程语言中变量是使用最频繁的.PL/SQL作为一个面向过程的数据库编程语言同样少不了变量,利用变量可以把PL/SQL块需要的参数传递进来,做到 ...

  3. (转)iOS应用架构谈 本地持久化方案及动态部署

    原文链接:http://casatwy.com/iosying-yong-jia-gou-tan-ben-di-chi-jiu-hua-fang-an-ji-dong-tai-bu-shu.html ...

  4. [翻译]为什么静态语言会受到复杂性的影响?

    翻译自 Why Static Languages Suffer From Complexity? 文章目录 前言 Record type - Array Sum type - Tree Value - ...

  5. iOS应用架构谈(4) 本地持久化方案及动态部署

    前言 嗯,你们要的大招.跟着这篇文章一起也发布了CTPersistance和CTJSBridge这两个库,希望大家在实际使用的时候如果遇到问题,就给我提issue或者PR或者评论区.每一个issue和 ...

  6. ssiOS应用架构谈 本地持久化方案及动态部署

    本文转载至 http://casatwy.com/iosying-yong-jia-gou-tan-ben-di-chi-jiu-hua-fang-an-ji-dong-tai-bu-shu.html ...

  7. iOS应用架构谈-本地持久化方案及动态部署

    iOS应用架构谈-开篇 iOS应用架构谈-view层的组织和调用方案 iOS应用架构谈-网络层设计方案 iOS应用架构谈-本地持久化方案及动态部署 iOS应用架构谈-组件化方案 前言 嗯,你们要的大招 ...

  8. 四,iOS应用架构谈 本地持久化方案及动态部署

    前言 嗯,你们要的大招.跟着这篇文章一起也发布了CTPersistance和CTJSBridge这两个库,希望大家在实际使用的时候如果遇到问题,就给我提issue或者PR或者评论区.每一个issue和 ...

  9. UnderRun和OverRun

    UnderRun pcm播放的场景,alsa中snd_pcm_write()返回–EPIPE,表示alsa取不到足够的数据: AudioTrack 写入数据的速度跟不上 AudioFlinger 读取 ...

最新文章

  1. java的虚引用_你不可不知的Java引用类型之——虚引用
  2. 一起谈.NET技术,asp.net控件开发基础(20)
  3. 代画PCB及C语言编程
  4. 使用yum安装CDH Hadoop集群
  5. 信息学奥赛C++语言:蛋糕盒子
  6. 怎么在php分页上结束分页,很经典的分页程序,该如何处理
  7. mysql学习(2)-Navicat Premium 12 链接MySQL8.0.11数据库报2059错误
  8. SAI绘制小树基础教程
  9. css鼠标变成小手(css中鼠标悬停是为小手)
  10. tomcat中的过滤器
  11. 实时PPP多系统组合与单系统解算ZTD和Clock差异
  12. XCode 3 中我的常用快捷键
  13. CSS-flex弹性布局补充
  14. 服务端socket程序
  15. 多行文本溢出显示省略号(…) +css样式
  16. STM32-MIDI音乐播放程序
  17. 转载:基于MATLAB的几种图像分割算法
  18. mac os 上启用简单http file server web 文件服务器
  19. 推动加密硬件性能改进的六项创新
  20. CV-Model【5】:Transformer

热门文章

  1. Linux涂鸦智能网关面板Turnkey方案
  2. 会放弃的人生才会更洒脱
  3. 如何下载npm离线安装包
  4. 吾爱破解安卓逆向入门教程学习心得(1-4)
  5. Java的自学之旅10
  6. solidworks与matlab接口,CAD软件与Matlab_SimMechanics接口问题研究
  7. 上海市公积金、养老保险、医疗保险转出事宜
  8. kodi netflix_如何让Kodi自动播放下一集(就像Netflix一样)
  9. intouch实时报警
  10. Linux 开发环境工具