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 永遠(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);
}
}
這段代碼是沒問題的,因為 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#利用PrintDocument定制打印單據(jù)的小例子
這篇文章主要給大家介紹了關(guān)于C#利用PrintDocument定制打印單據(jù)的小例子,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用C#具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05
C#導(dǎo)出生成excel文件的方法小結(jié)(xml,html方式)
C#導(dǎo)出生成excel文件的方法小結(jié)(xml,html方式)。需要的朋友可以過來參考下,希望對大家有所幫助2013-10-10
C#對文件進(jìn)行批量重命名或者對某單個文件進(jìn)行改名的示例代碼
這篇文章主要介紹了C#對文件進(jìn)行批量重命名或者對某個單獨的文件進(jìn)行改名的實現(xiàn)方法,文中有相關(guān)的代碼示例供大家參考,具有一定的參考價值,需要的朋友可以參考下2024-05-05
C#利用WinForm實現(xiàn)查看指定目錄下所有圖片功能
Windows 窗體是用于生成 Windows 桌面應(yīng)用的 UI 框架, 它提供了一種基于 Visual Studio 中提供的可視化設(shè)計器創(chuàng)建桌面應(yīng)用的高效方法,本文介紹了C#利用WinForm實現(xiàn)可以查看指定目錄文件下所有圖片功能,需要的朋友可以參考下2024-05-05

