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

