.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ù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
asp.net SqlParameter關于Like的傳參數(shù)無效問題
用傳參方式模糊查詢searchName2009-06-06
ASP.NET技巧:數(shù)據(jù)島出到Excel最為簡易的方法
ASP.NET技巧:數(shù)據(jù)島出到Excel最為簡易的方法...2006-09-09
MVC+Bootstrap+Drapper使用PagedList.Mvc支持多查詢條件分頁
這篇文章主要介紹了MVC+Bootstrap+Drapper使用PagedList.Mvc支持多查詢條件分頁,需要的朋友可以參考下2017-05-05
asp.net 繼承自Page實現(xiàn)統(tǒng)一頁面驗證與錯誤處理
一直以來,我都在思考以前一個項目中,后臺文件中很多的.aspx文件上的權限判斷問題,傻乎乎的我基本上每個文件當時都給加了一句2009-04-04
ASP.NET在底層類庫中獲取Session C#類中獲取Session
本文介紹一些在類庫中獲取Session、Page、Resposne、Request的方法和步驟,方便初學者使用。2016-03-03
ASP.NET Core MVC學習教程之路由(Routing)
這篇文章主要給大家介紹了關于ASP.NET Core MVC學習教程之路由(Routing)的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用ASP.NET Core MVC具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧2019-07-07
IP地址與整數(shù)之間的轉(zhuǎn)換實現(xiàn)代碼(asp.net)
把這個整數(shù)轉(zhuǎn)換成一個32位二進制數(shù)。從左到右,每8位進行一下分割,得到4段8位的二進制數(shù),把這些二進制數(shù)轉(zhuǎn)換成整數(shù)然后加上”?!本褪沁@個ip地址了2012-09-09

