這部分,這是由於子類對象可以通過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函數,而引用類型最好不要重載定義==操作符。
返回教程目錄