日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

为record类型自定义Equals方法

發(fā)布時間:2023/12/4 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 为record类型自定义Equals方法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前言

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類型中的屬性是引用類型時,相等性就失效了。例如:

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方法。

結(jié)論

如果要為record類型自定義Equals方法,必須定義virtual方法。

想了解更多內(nèi)容,請關(guān)注我的個人公眾號”My IO“

總結(jié)

以上是生活随笔為你收集整理的为record类型自定义Equals方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。