C#中重載相等(==)運(yùn)算符示例
運(yùn)算符重載一直是一個(gè)很詭異事情,因?yàn)樵趯懘a的時(shí)候,不知道某個(gè)運(yùn)算符有沒有被重載過。在 C++ 里面,運(yùn)算符重載可以寫在類的外面,當(dāng) intellisense 不工作的時(shí)候,找到一個(gè)運(yùn)算符的重載函數(shù)是一件相當(dāng)頭疼的事情。這個(gè)問題在 C# 中改善了不少,因?yàn)檫\(yùn)算符重載一定要寫在類內(nèi),而且 intellisense 很強(qiáng)大。不過另一個(gè)問題又產(chǎn)生了……
先來看 C++ 中的“==”重載:
struct A{ int x; int y; }; inline bool operator == (const A& a, const A& b){ return a.x == b.x && a.y == b.y; }
上面這段代碼中,由于聲明的關(guān)系,a 和 b 永遠(yuǎn)不可能為 NULL,所以直接調(diào)用 a.x 和 b.x 是沒有問題的。
而在 C# 中:
struct A { public int x, y; public static bool operator ==(A a, A b) { return a.x == b.x && a.y == b.y; } public static bool operator !=(A a, A b) { return !(a == b); } }
這段代碼是沒問題的,因?yàn)?A 是 struct,而 struct 不可能為 null。但換成 class 就有問題了,比如:
class A { public int x, y; public static bool operator == (A a, A b) { if (a == null && b == null) { return true; } if (a == null || b == null) { return false; } return a.x == b.x && a.y == b.y; } public static bool operator != (A a, A b) { return !(a == b); } }
由于 reference type 可以為 null,所以要先檢查 a 和 b 是不是 null,但是“a == null”這一句又會去調(diào)用“operator ==”,于是就無限遞歸下去了……想了很久都沒想出來變通的方法,而且 System.String 的實(shí)現(xiàn)也很詭異:
public static bool operator == (string a, string b) { return Equals(a, b); } public static bool Equals (string a, string b) { return ((a == b) || (((a != null) && (b != null)) && EqualsHelper(a, b))); }
看上去也會無限遞歸的(Reflector 出來的,不一定準(zhǔn)),很神奇……
雖然對于 Referece type 不建議重載==,但是不建議并不代表不能用吧,這個(gè)設(shè)計(jì)太挫了…
相關(guān)文章
C#統(tǒng)計(jì)字符串里中文漢字個(gè)數(shù)的方法
這篇文章主要介紹了C#統(tǒng)計(jì)字符串里中文漢字個(gè)數(shù)的方法,本文通過正則實(shí)現(xiàn)統(tǒng)計(jì)出一段字符串里中文字?jǐn)?shù),需要的朋友可以參考下2014-08-08C#中構(gòu)造函數(shù)和析構(gòu)函數(shù)用法實(shí)例詳解
這篇文章主要介紹了C#中構(gòu)造函數(shù)和析構(gòu)函數(shù)用法,結(jié)合實(shí)例形式詳細(xì)分析了C#中構(gòu)造函數(shù)與析構(gòu)函數(shù)的原理、定義、使用方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下2016-06-06C#使用BinaryFormatter類、ISerializable接口、XmlSerializer類進(jìn)行序列化和反序列
這篇文章介紹了C#使用BinaryFormatter類、ISerializable接口、XmlSerializer類進(jìn)行序列化和反序列化的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-09-09C# Winfrom實(shí)現(xiàn)Skyline畫直線功能的示例代碼
這篇文章主要介紹了C# Winfrom實(shí)現(xiàn)Skyline畫直線功能的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12C# 添加、修改以及刪除Excel迷你圖表的實(shí)現(xiàn)方法
下面小編就為大家分享一篇C# 添加、修改以及刪除Excel迷你圖表的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2017-12-12