程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 《Effective C#》:區別四個判等函數(3)

《Effective C#》:區別四個判等函數(3)

編輯:關於C語言

這部分,這是由於子類對象可以通過as轉化成基類對象,從而造 成不同類型對象可以進行判等操作,違反了等價關系。

除此外對於類型 的Equals函數來,其實並沒有限制類型非要屬於引用類型,對於值類型也是可以 重載此函數,但是我並不推薦,主要是Equals函數的參數類型是不可變的,也就 是說通過此方法,值類型要經過裝箱操作,而這是比較影響效率的。

而 對於值類型來說,我推薦使用最後一種判等函數,即重載運算符==函數,其大致 形式如下:

public static bool Operator == ( KeyData left, KeyData right );

對於一個值類型而言,其的大致形式應該如下 :

public struct KeyData
{
 private int nData;
 public int Data
 {
  get{ return nData;}
  set{ nData = value; }
 }
 public static bool Operator == ( KeyData left, KeyData right )
 {
  return left.Data == right.Data;
 }
 public static bool Operator != ( KeyData left, KeyData right )
 {
  return left.Data != right.Data;
 }
}

由於==操作與!=操作要同步定 義,所以在定義==重載函數的時候,也要定義!=重載函數。這也是.Net在判等操 作保持一致性。那麼對於最後一個判等函數,這種重載運算符的方法並不適合引 用類型。這就是.Net經常現象,去判斷兩個引用類型,不要用==,而要用某個對 象的Equals函數。所以在編寫自己類型的時候,要保留這種風格。

那麼 對於以上介紹的四種判等函數,會產生如下類似的對比表格。

操作結果取決於 適用范圍 建議 Object.ReferenceEquals 兩個參數對象是否屬於同一個引用 引用類型 不要用它來判斷值類型數據 Object.Equals 參數類型自身的判等函數 無限制 考慮裝箱操作對值類型數據產生的影響 類型的Equals 類型重載函數 無限制 考慮裝箱操作對值類型數據產生的影響 類型的==重載 類型重載函數 無限制 不要在引用類型中重載此運算符

那麼在編寫類型判等函數的時候,要注意些什麼呢,給出如下幾點建議 。

首先,要判斷當前定義的類型是否具有判等的意義;

其次,定 義類型的判等函數要滿足等價規則;

最後一點,值類型最好不要重載定 義Equals函數,而引用類型最好不要重載定義==操作符。

返回教程目錄

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