c#中record的使用场景有哪些-创新互联

今天就跟大家聊聊有关c#中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(str1);

 var str2 = "{\"Name\":\"Tom\",\"Id\":1}";
 var p2 = JsonConvert.DeserializeObject(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();
using var httpClient = new HttpClient();
while(i-- > 0)
{
 var responseText = await httpClient.GetStringAsync("");
 var result = JsonConvert.DeserializeObject(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 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();
  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 Properties { get; set; }

 public LogHelperLoggingEvent Copy()
 {
 var newEvent = (LogHelperLoggingEvent)MemberwiseClone();
 if (Properties != null)
 {
  newEvent.Properties = new Dictionary();
  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 Properties { get; set; }

 public LogHelperLoggingEvent Copy()
 {
 var newEvent = this with{ };
 if (Properties != null)
 {
  newEvent.Properties = new Dictionary();
  foreach (var property in Properties)
  {
  newEvent.Properties[property.Key] = property.Value;
  }
 }
 return newEvent;
 }
}

看完上述内容,你们对c#中record的使用场景有哪些有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注创新互联行业资讯频道,感谢大家的支持。


本文名称:c#中record的使用场景有哪些-创新互联
URL标题:http://pwwzsj.com/article/dphdss.html