C#中重載相等(==)運算符示例
運算符重載一直是一個很詭異事情,因為在寫代碼的時候,不知道某個運算符有沒有被重載過。在 C++ 里面,運算符重載可以寫在類的外面,當(dāng) intellisense 不工作的時候,找到一個運算符的重載函數(shù)是一件相當(dāng)頭疼的事情。這個問題在 C# 中改善了不少,因為運算符重載一定要寫在類內(nèi),而且 intellisense 很強大。不過另一個問題又產(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 永遠不可能為 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); } }
這段代碼是沒問題的,因為 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 的實現(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 不建議重載==,但是不建議并不代表不能用吧,這個設(shè)計太挫了…
相關(guān)文章
C#中構(gòu)造函數(shù)和析構(gòu)函數(shù)用法實例詳解
這篇文章主要介紹了C#中構(gòu)造函數(shù)和析構(gòu)函數(shù)用法,結(jié)合實例形式詳細分析了C#中構(gòu)造函數(shù)與析構(gòu)函數(shù)的原理、定義、使用方法與相關(guān)注意事項,需要的朋友可以參考下2016-06-06C#使用BinaryFormatter類、ISerializable接口、XmlSerializer類進行序列化和反序列
這篇文章介紹了C#使用BinaryFormatter類、ISerializable接口、XmlSerializer類進行序列化和反序列化的方法,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-09-09C# Winfrom實現(xiàn)Skyline畫直線功能的示例代碼
這篇文章主要介紹了C# Winfrom實現(xiàn)Skyline畫直線功能的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12C# 添加、修改以及刪除Excel迷你圖表的實現(xiàn)方法
下面小編就為大家分享一篇C# 添加、修改以及刪除Excel迷你圖表的實現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2017-12-12