.NET?6中為record類型自定義Equals方法
前言:
record類型,這是一種新引用類型,而不是類或結(jié)構(gòu)。record與類不同,區(qū)別在于record類型使用基于值的相等性。
例如:
public record DemoRecord(int id); public class DemoClass { ? ? public DemoClass(int id) ? ? { ? ? ? ? this.id = id; ? ? } ? ? public int id { get; } }
但是,當(dāng)record類型中的屬性是引用類型時(shí),相等性就失效了。
例如:
public record A(int[] ids);
一、重寫Equals方法
首先想到的解決方法是像類一樣重寫Equals方法:
public class DemoClass { ? ? public override bool Equals(object obj) ? ? { ? ? ? ? if (obj == null || obj is not DemoClass demoClass) ? ? ? ? { ? ? ? ? ? ? return false; ? ? ? ? } ? ? ? ? return id.Equals(demoClass.id); ? ? } }
但是發(fā)現(xiàn)record類型居然不提供重寫Equals方法的能力
二、自定義Equals方法
反編譯示例代碼,發(fā)現(xiàn)編譯器確實(shí)為record類型生成了虛擬的Equals方法:
public virtual bool Equals(A other) { ? ? return this == other || (other != null && this.EqualityContract == other.EqualityContract && EqualityComparer<int[]>.Default.Equals(this.<ids>k__BackingField, other.<ids>k__BackingField)); }
但是,如果手寫override方法,編譯報(bào)錯(cuò)
如果不加override,編譯也報(bào)錯(cuò):
但是,根據(jù)“??必須允許替代??”這個(gè)錯(cuò)誤提示,我們加上了virtual方法,居然成功了:
public record B(int[] ids) { ? ? public virtual bool Equals(B b) ? ? { ? ? ? ? if (b is null) return false; ? ? ? ? return ids.SequenceEqual(b.ids); ? ? } }
而且反編譯示例代碼,發(fā)現(xiàn)編譯器沒有再為record
類型自動(dòng)生成虛擬的Equals
方法。
三、結(jié)論
如果要為record類型自定義Equals方法,必須定義virtual方法。
到此這篇關(guān)于.NET 6中為record類型自定義Equals方法的文章就介紹到這了,更多相關(guān)record自定義Equals內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
VS2015自帶LocalDB數(shù)據(jù)庫(kù)用法詳解
這篇文章主要為大家詳細(xì)介紹了VS2015自帶LocalDB數(shù)據(jù)庫(kù)的用法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06C#實(shí)現(xiàn)支持?jǐn)帱c(diǎn)續(xù)傳多線程下載客戶端工具類
C#實(shí)現(xiàn)支持?jǐn)帱c(diǎn)續(xù)傳多線程下載的 Http Web 客戶端工具類 (C# DIY HttpWebClient),感興趣的朋友可以參考下本文,或許對(duì)你有所幫助2013-04-04asp.net簡(jiǎn)化接收參數(shù)值的函數(shù)
獲取querystring 參數(shù)名2008-05-05未能加載文件或程序集“AspNetPager”或它的某一個(gè)依賴項(xiàng)。拒絕訪問
突然間,訪問站點(diǎn)所有頁(yè)面都出錯(cuò),全提示:未能加載文件或程序集“AspNetPager”或它的某一個(gè)依賴項(xiàng)。拒絕訪問2012-06-06ASP.NET?MVC使用Boostrap實(shí)現(xiàn)產(chǎn)品展示、查詢、排序、分頁(yè)
這篇文章介紹了ASP.NET?MVC使用Boostrap實(shí)現(xiàn)產(chǎn)品展示、查詢、排序、分頁(yè)的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-09-09阿里云上從ASP.NET線程角度對(duì)“黑色30秒”問題的全新分析
在這篇博文中,我們拋開對(duì)阿里云的懷疑,完全從ASP.NET的角度進(jìn)行分析,看能不能找到針對(duì)問題現(xiàn)象的更合理的解釋2015-09-09asp.net 數(shù)據(jù)綁定 使用eval 時(shí)候報(bào) 字符文本中的字符太多 問題的解決方法
asp.net 數(shù)據(jù)綁定 使用eval 時(shí)候報(bào) 字符文本中的字符太多 問題解決,需要的朋友可以參考下。2010-09-09.NET Core 遷移躺坑記續(xù)集之Win下莫名其妙的超時(shí)
這篇文章主要介紹了.NET Core 遷移躺坑記續(xù)集之Win下莫名其妙的超時(shí),本文分步驟給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-04-04