欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#中重載相等(==)運算符示例

 更新時間:2015年06月11日 09:49:58   投稿:junjie  
這篇文章主要介紹了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#常用排序方式總結(jié)

    C#常用排序方式總結(jié)

    在最近的項目中經(jīng)常會對C#中的數(shù)據(jù)進行排序,對于基本數(shù)據(jù)類型,其排序方式比較簡單,只需要調(diào)用內(nèi)置算法即可實現(xiàn),但對于自定義數(shù)據(jù)類型以及自定義排序規(guī)則的情況實現(xiàn)起來就比較麻煩,所以在本文章中將詳細介紹一下在中C#中如何對數(shù)據(jù)進行排序,需要的朋友可以參考下
    2024-01-01
  • C#統(tǒng)計字符串里中文漢字個數(shù)的方法

    C#統(tǒng)計字符串里中文漢字個數(shù)的方法

    這篇文章主要介紹了C#統(tǒng)計字符串里中文漢字個數(shù)的方法,本文通過正則實現(xiàn)統(tǒng)計出一段字符串里中文字數(shù),需要的朋友可以參考下
    2014-08-08
  • C#配置文件操作類分享

    C#配置文件操作類分享

    這篇文章主要分享了C#配置文件操作類,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • C#獲取進程和對進程的操作

    C#獲取進程和對進程的操作

    下面是一個例子:獲取進程列表、創(chuàng)建“違禁”進程名單、查找并殺死進程。注意先要在項目里添加System.Management的引用。
    2013-04-04
  • C#如何將Excel轉(zhuǎn)換為PDF

    C#如何將Excel轉(zhuǎn)換為PDF

    這篇文章主要介紹了C#如何將Excel轉(zhuǎn)換為PDF問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • C#中構(gòu)造函數(shù)和析構(gòu)函數(shù)用法實例詳解

    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-06
  • C#使用BinaryFormatter類、ISerializable接口、XmlSerializer類進行序列化和反序列化

    C#使用BinaryFormatter類、ISerializable接口、XmlSerializer類進行序列化和反序列

    這篇文章介紹了C#使用BinaryFormatter類、ISerializable接口、XmlSerializer類進行序列化和反序列化的方法,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-09-09
  • C# Winfrom實現(xiàn)Skyline畫直線功能的示例代碼

    C# Winfrom實現(xiàn)Skyline畫直線功能的示例代碼

    這篇文章主要介紹了C# Winfrom實現(xiàn)Skyline畫直線功能的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • C# 添加、修改以及刪除Excel迷你圖表的實現(xiàn)方法

    C# 添加、修改以及刪除Excel迷你圖表的實現(xiàn)方法

    下面小編就為大家分享一篇C# 添加、修改以及刪除Excel迷你圖表的實現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12
  • C#中enum和string的相互轉(zhuǎn)換

    C#中enum和string的相互轉(zhuǎn)換

    這篇文章主要介紹了C#中enum和string的相互轉(zhuǎn)換的相關(guān)資料,需要的朋友可以參考下
    2017-09-09

最新評論