程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#中重載相等(==)運算符示例

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

編輯:C#入門知識

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 不建議重載==,然則不建議其實不代表不克不及用吧,這個設計太挫了…

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved