最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

c# record的使用場景

 更新時間:2021年02月01日 09:10:43   作者:WeihanLi  
這篇文章主要介紹了c# record的使用場景,幫助大家更好的理解和學(xué)習(xí)使用c#的新特性,感興趣的朋友可以了解下

Intro

之前我們有介紹過 record 基本知識,record 會實現(xiàn)基于值的類型比較,最近遇到的幾個問題覺得用 record 來解決會非常方便,分享一下

基于值的類型比較

最近有遇到一個場景,需要比較兩個 JSON 字符串是否相等,字符串比較簡單,就是一個固定值的 Dictionary,或者認(rèn)為它就是一個簡單的 Model,但是 JSON 字符串的的屬性順序可能不同,比如說下面的這個示例:

{"Id":1, "Name":"Tom"}, {"Name":"Tom", "Id":1},這兩個字符串從字符串上來說順序不同,自然不相等,但是對應(yīng)的屬性的值是相同的,怎么比較方便的進行比較呢,使用 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 有收到反饋說,調(diào)用多次返回的結(jié)果不同,于是我就想寫一段代碼調(diào)用個一百次看是否會有重復(fù),大致代碼如下:

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 來實現(xiàn)去重

對象克隆

record 提供了 with 表達(dá)式來方便的克隆一個新的對象,所以在需要克隆的時候可以考慮使用 record,另外所有原型模式的地方都可以考慮使用 record 來實現(xiàn)

之前我實現(xiàn)了一個簡單的日志框架,有一個日志對象,定義如下:

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 表達(dá)式返回的是強類型的對象,不再需要自己做強制類型轉(zhuǎn)換了,上面的做法還是比較取巧的辦法,使用了 MemberwiseClone 去做復(fù)制,如果自己寫代碼一個一個復(fù)制,將會更加繁瑣,使用 record 之后就很簡單了,只是我們需要注意一下,with 表達(dá)式也只是淺復(fù)制,如果內(nèi)部包含復(fù)雜引用類型,需要小心使用

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 在很多場景下能夠簡化我們的代碼,使得代碼更加干凈簡潔,在合適的場景下不要忘記使用哦~

微軟的反向代理項目 YARP 也使用了 record 來簡化原來代碼中 DeepClone 的功能,可以參考 PR:https://github.com/microsoft/reverse-proxy/pull/662

以上就是c# record的使用場景的詳細(xì)內(nèi)容,更多關(guān)于c# record的使用場景的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C#使用RabbitMq隊列(Sample,Work,Fanout,Direct等模式的簡單使用)

    C#使用RabbitMq隊列(Sample,Work,Fanout,Direct等模式的簡單使用)

    這篇文章主要介紹了C#使用RabbitMq隊列(Sample,Work,Fanout,Direct等模式的簡單使用),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10
  • C# DataTable分頁處理實例代碼

    C# DataTable分頁處理實例代碼

    有時候我們從數(shù)據(jù)庫獲取的數(shù)據(jù)量太大,而我們不需要一次性顯示那么多的時候,我們就要對數(shù)據(jù)進行分頁處理了,讓每頁顯示不同的數(shù)據(jù)。
    2017-06-06
  • C#實現(xiàn)在Excel中添加篩選器并執(zhí)行篩選的操作

    C#實現(xiàn)在Excel中添加篩選器并執(zhí)行篩選的操作

    自動篩選器是 Excel 中的一個基本但極其有用的功能,它可以讓你根據(jù)特定的條件來自動隱藏和顯示你的數(shù)據(jù),當(dāng)有大量的數(shù)據(jù)需要處理時,這個功能可以幫你快速找到你需要的信息,下面將介紹如何使用免費.NET Excel庫在Excel中添加、應(yīng)用和刪除自動篩選器,需要的朋友可以參考下
    2024-05-05
  • 詳解c# 協(xié)變和逆變

    詳解c# 協(xié)變和逆變

    這篇文章主要介紹了c# 協(xié)變和逆變的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)c#,感興趣的朋友可以了解下
    2020-11-11
  • C#影院售票系統(tǒng)畢業(yè)設(shè)計(3)

    C#影院售票系統(tǒng)畢業(yè)設(shè)計(3)

    這篇文章介紹了C#影院售票系統(tǒng)畢業(yè)設(shè)計,文章主要內(nèi)容是關(guān)于購票、座位顏色狀態(tài)的改變及場次座位狀態(tài)的顯示,需要的朋友可以參考下
    2015-11-11
  • WPF實現(xiàn)動畫效果(四)之緩動函數(shù)

    WPF實現(xiàn)動畫效果(四)之緩動函數(shù)

    這篇文章介紹了WPF實現(xiàn)動畫效果之緩動函數(shù),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • c#求點到直線的投影點坐標(biāo)

    c#求點到直線的投影點坐標(biāo)

    這篇文章主要介紹了c#求直線外一點到該直線的投影點,大家參考使用吧
    2013-12-12
  • C#實現(xiàn)石頭剪刀布游戲

    C#實現(xiàn)石頭剪刀布游戲

    這篇文章主要為大家詳細(xì)介紹了C#實現(xiàn)石頭剪刀布游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-10-10
  • C#信號量用法簡單示例

    C#信號量用法簡單示例

    這篇文章主要介紹了C#信號量用法,結(jié)合簡單C#控制臺應(yīng)用程序形式分析了信號量的功能、定義、調(diào)用、釋放等操作技巧,需要的朋友可以參考下
    2016-07-07
  • .net后臺獲取html控件值的2種方法

    .net后臺獲取html控件值的2種方法

    .net后臺獲取html控件值的2種方法,需要的朋友可以參考一下
    2013-04-04

最新評論

辽宁省| 秦皇岛市| 泸定县| 安多县| 余江县| 改则县| 汝南县| 巴中市| 镇康县| 林甸县| 乐至县| 余庆县| 雅安市| 炎陵县| 临颍县| 湖北省| 巴彦淖尔市| 陈巴尔虎旗| 杨浦区| 新野县| 江山市| 嘉兴市| 和顺县| 延安市| 石屏县| 芜湖市| 南木林县| 高密市| 邳州市| 澳门| 五华县| 永新县| 翁牛特旗| 南涧| 英德市| 方山县| 普定县| 西青区| 璧山县| 双城市| 晴隆县|