.NET?6中為record類型自定義Equals方法
前言:
record類型,這是一種新引用類型,而不是類或結構。record與類不同,區(qū)別在于record類型使用基于值的相等性。
例如:
public record DemoRecord(int id); public class DemoClass { ? ? public DemoClass(int id) ? ? { ? ? ? ? this.id = id; ? ? } ? ? public int id { get; } }
但是,當record類型中的屬性是引用類型時,相等性就失效了。
例如:
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)編譯器確實為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方法,編譯報錯
如果不加override,編譯也報錯:
但是,根據(jù)“??必須允許替代??”這個錯誤提示,我們加上了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
類型自動生成虛擬的Equals
方法。
三、結論
如果要為record類型自定義Equals方法,必須定義virtual方法。
到此這篇關于.NET 6中為record類型自定義Equals方法的文章就介紹到這了,更多相關record自定義Equals內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
VS2015自帶LocalDB數(shù)據(jù)庫用法詳解
這篇文章主要為大家詳細介紹了VS2015自帶LocalDB數(shù)據(jù)庫的用法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-06-06C#實現(xiàn)支持斷點續(xù)傳多線程下載客戶端工具類
C#實現(xiàn)支持斷點續(xù)傳多線程下載的 Http Web 客戶端工具類 (C# DIY HttpWebClient),感興趣的朋友可以參考下本文,或許對你有所幫助2013-04-04未能加載文件或程序集“AspNetPager”或它的某一個依賴項。拒絕訪問
突然間,訪問站點所有頁面都出錯,全提示:未能加載文件或程序集“AspNetPager”或它的某一個依賴項。拒絕訪問2012-06-06ASP.NET?MVC使用Boostrap實現(xiàn)產(chǎn)品展示、查詢、排序、分頁
這篇文章介紹了ASP.NET?MVC使用Boostrap實現(xiàn)產(chǎn)品展示、查詢、排序、分頁的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-09-09阿里云上從ASP.NET線程角度對“黑色30秒”問題的全新分析
在這篇博文中,我們拋開對阿里云的懷疑,完全從ASP.NET的角度進行分析,看能不能找到針對問題現(xiàn)象的更合理的解釋2015-09-09asp.net 數(shù)據(jù)綁定 使用eval 時候報 字符文本中的字符太多 問題的解決方法
asp.net 數(shù)據(jù)綁定 使用eval 時候報 字符文本中的字符太多 問題解決,需要的朋友可以參考下。2010-09-09.NET Core 遷移躺坑記續(xù)集之Win下莫名其妙的超時
這篇文章主要介紹了.NET Core 遷移躺坑記續(xù)集之Win下莫名其妙的超時,本文分步驟給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-04-04