为record类型自定义Equals方法
生活随笔
收集整理的這篇文章主要介紹了
为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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: dotNet Core使用SignalR
- 下一篇: Avalonia跨平台入门第十三篇之Ex