C#中重載相等(==)運算符示例。本站提示廣大學習愛好者:(C#中重載相等(==)運算符示例)文章只能為提供參考,不一定能成為您想要的結果。以下是C#中重載相等(==)運算符示例正文
運算符重載一向是一個很詭異工作,由於在寫代碼的時刻,不曉得某個運算符有無被重載過。在 C++ 外面,運算符重載可以寫在類的裡面,當 intellisense 不任務的時刻,找到一個運算符的重載函數是一件相當頭疼的工作。這個成績在 C# 中改良了很多,由於運算符重載必定要寫在類內,並且 intellisense 很壯大。不外另外一個成績又發生了……
先來看 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; }
下面這段代碼中,因為聲明的關系,a 和 b 永久弗成能為 NULL,所以直接挪用 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”這一句又會去挪用“operator ==”,因而就無窮遞歸下去了……想了良久都沒想出來變通的辦法,並且 System.String 的完成也很詭異:
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 出來的,紛歧定准),很奇異……
固然關於 Referece type 不建議重載==,然則不建議其實不代表不克不及用吧,這個設計太挫了…