91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

c#中record的使用場景有哪些

發布時間:2021-02-03 16:10:45 來源:億速云 閱讀:211 作者:Leah 欄目:開發技術

今天就跟大家聊聊有關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<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;
 }
}

看完上述內容,你們對c#中record的使用場景有哪些有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

湟源县| 秀山| 澄迈县| 奉贤区| 那坡县| 于田县| 吴堡县| 博客| 谢通门县| 翼城县| 黄骅市| 宾阳县| 纳雍县| 明水县| 厦门市| 棋牌| 波密县| 建昌县| 额敏县| 湛江市| 衢州市| 揭西县| 合江县| 琼海市| 都匀市| 榆中县| 青冈县| 桑植县| 东方市| 体育| 大庆市| 城市| 蒙阴县| 周口市| 南丰县| 南通市| 贵定县| 佳木斯市| 定边县| 鄂伦春自治旗| 贵德县|