欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

.NET?6中為record類型自定義Equals方法

 更新時(shí)間:2022年03月15日 10:55:12   作者:My?IO  
這篇文章主要介紹了.NET?6中為record類型自定義Equals方法,record類型,這是一種新引用類型,而不是類或結(jié)構(gòu)。record與類不同,區(qū)別在于record類型使用基于值的相等性,下文小編將介紹更多詳細(xì)資料,需要的朋友可以參考一下

前言:

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)文章

最新評(píng)論