C#中重載相等(==)運(yùn)算符示例
運(yùn)算符重載一直是一個(gè)很詭異事情,因?yàn)樵趯?xiě)代碼的時(shí)候,不知道某個(gè)運(yùn)算符有沒(méi)有被重載過(guò)。在 C++ 里面,運(yùn)算符重載可以寫(xiě)在類(lèi)的外面,當(dāng) intellisense 不工作的時(shí)候,找到一個(gè)運(yùn)算符的重載函數(shù)是一件相當(dāng)頭疼的事情。這個(gè)問(wèn)題在 C# 中改善了不少,因?yàn)檫\(yùn)算符重載一定要寫(xiě)在類(lèi)內(nèi),而且 intellisense 很強(qiáng)大。不過(guò)另一個(gè)問(wèn)題又產(chǎn)生了……
先來(lái)看 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 是沒(méi)有問(wèn)題的。
而在 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);
}
}
這段代碼是沒(méi)問(wèn)題的,因?yàn)?A 是 struct,而 struct 不可能為 null。但換成 class 就有問(wèn)題了,比如:
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”這一句又會(huì)去調(diào)用“operator ==”,于是就無(wú)限遞歸下去了……想了很久都沒(méi)想出來(lái)變通的方法,而且 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)));
}
看上去也會(huì)無(wú)限遞歸的(Reflector 出來(lái)的,不一定準(zhǔn)),很神奇……
雖然對(duì)于 Referece type 不建議重載==,但是不建議并不代表不能用吧,這個(gè)設(shè)計(jì)太挫了…
相關(guān)文章
C#利用PrintDocument定制打印單據(jù)的小例子
這篇文章主要給大家介紹了關(guān)于C#利用PrintDocument定制打印單據(jù)的小例子,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C#具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05
C#導(dǎo)出生成excel文件的方法小結(jié)(xml,html方式)
C#導(dǎo)出生成excel文件的方法小結(jié)(xml,html方式)。需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2013-10-10
C#對(duì)文件進(jìn)行批量重命名或者對(duì)某單個(gè)文件進(jìn)行改名的示例代碼
這篇文章主要介紹了C#對(duì)文件進(jìn)行批量重命名或者對(duì)某個(gè)單獨(dú)的文件進(jìn)行改名的實(shí)現(xiàn)方法,文中有相關(guān)的代碼示例供大家參考,具有一定的參考價(jià)值,需要的朋友可以參考下2024-05-05
C#實(shí)現(xiàn)身份證驗(yàn)證功能的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何利用C#實(shí)現(xiàn)身份證驗(yàn)證功能,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C#有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下2022-12-12
C#利用WinForm實(shí)現(xiàn)查看指定目錄下所有圖片功能
Windows 窗體是用于生成 Windows 桌面應(yīng)用的 UI 框架, 它提供了一種基于 Visual Studio 中提供的可視化設(shè)計(jì)器創(chuàng)建桌面應(yīng)用的高效方法,本文介紹了C#利用WinForm實(shí)現(xiàn)可以查看指定目錄文件下所有圖片功能,需要的朋友可以參考下2024-05-05

