最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2015年06月11日 09:49:58   投稿:junjie  
這篇文章主要介紹了C#中重載相等(==)運(yùn)算符示例,運(yùn)算符重載一直是一個(gè)很詭異事情,本文通過實(shí)例探討由運(yùn)算符重載引出的一個(gè)問題,需要的朋友可以參考下

運(yùn)算符重載一直是一個(gè)很詭異事情,因?yàn)樵趯懘a的時(shí)候,不知道某個(gè)運(yùn)算符有沒有被重載過。在 C++ 里面,運(yùn)算符重載可以寫在類的外面,當(dāng) intellisense 不工作的時(shí)候,找到一個(gè)運(yùn)算符的重載函數(shù)是一件相當(dāng)頭疼的事情。這個(gè)問題在 C# 中改善了不少,因?yàn)檫\(yùn)算符重載一定要寫在類內(nèi),而且 intellisense 很強(qiáng)大。不過另一個(gè)問題又產(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);
 }
}

這段代碼是沒問題的,因?yàn)?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”這一句又會(huì)去調(diào)用“operator ==”,于是就無限遞歸下去了……想了很久都沒想出來變通的方法,而且 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ì)無限遞歸的(Reflector 出來的,不一定準(zhǔn)),很神奇……

雖然對(duì)于 Referece type 不建議重載==,但是不建議并不代表不能用吧,這個(gè)設(shè)計(jì)太挫了…

相關(guān)文章

  • C#利用PrintDocument定制打印單據(jù)的小例子

    C#利用PrintDocument定制打印單據(jù)的小例子

    這篇文章主要給大家介紹了關(guān)于C#利用PrintDocument定制打印單據(jù)的小例子,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C#具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • C#異步執(zhí)行任務(wù)的方法

    C#異步執(zhí)行任務(wù)的方法

    這篇文章主要介紹了C#異步執(zhí)行任務(wù)的方法,以一個(gè)簡(jiǎn)單實(shí)例形式分析了C#異步執(zhí)行的實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • C#導(dǎo)出生成excel文件的方法小結(jié)(xml,html方式)

    C#導(dǎo)出生成excel文件的方法小結(jié)(xml,html方式)

    C#導(dǎo)出生成excel文件的方法小結(jié)(xml,html方式)。需要的朋友可以過來參考下,希望對(duì)大家有所幫助
    2013-10-10
  • C#過濾sql特殊字符串的方法

    C#過濾sql特殊字符串的方法

    這篇文章介紹了C#過濾sql特殊字符串的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • C#對(duì)文件進(jìn)行批量重命名或者對(duì)某單個(gè)文件進(jìn)行改名的示例代碼

    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)證功能的示例代碼

    C#實(shí)現(xiàn)身份證驗(yàn)證功能的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何利用C#實(shí)現(xiàn)身份證驗(yàn)證功能,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C#有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下
    2022-12-12
  • Winform窗體傳值的方法(示例)

    Winform窗體傳值的方法(示例)

    C#開發(fā)windows應(yīng)用程序項(xiàng)目時(shí),不同窗口之間傳值有很多中方法,在此給大家介紹兩種比較常用的winform窗體傳值的方法,有需要的朋友可以參考下
    2015-08-08
  • C#中使用Spire.doc對(duì)word的操作方式

    C#中使用Spire.doc對(duì)word的操作方式

    這篇文章主要介紹了C#中使用Spire.doc對(duì)word的操作方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • C#實(shí)現(xiàn)更改MDI窗體背景顏色的方法

    C#實(shí)現(xiàn)更改MDI窗體背景顏色的方法

    這篇文章主要介紹了C#實(shí)現(xiàn)更改MDI窗體背景顏色的方法,涉及C#窗體背景色的設(shè)置技巧,非常簡(jiǎn)單實(shí)用,需要的朋友可以參考下
    2015-08-08
  • C#利用WinForm實(shí)現(xiàn)查看指定目錄下所有圖片功能

    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

最新評(píng)論

呼玛县| 泰兴市| 夏津县| 大竹县| 恭城| 荥经县| 牟定县| 泸溪县| 鞍山市| 普安县| 曲沃县| 桂东县| 永新县| 安多县| 锡林浩特市| 团风县| 汤阴县| 永福县| 抚宁县| 水富县| 鄯善县| 九江县| 泉州市| 漳州市| 登封市| 秭归县| 昌乐县| 大理市| 濉溪县| 临汾市| 沐川县| 合山市| 佛学| 信宜市| 隆尧县| 高雄县| 修文县| 平顶山市| 商城县| 阿尔山市| 城固县|