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

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

編輯:關於C語言

.Net有四個判等函數?不少人看到這個標題,會對此感到懷疑。事實上確是 如此,.Net提供了ReferenceEquals、靜態Equals,具體類型的Equals以及==操 作符這四個判等函數。但是這四個函數之間有細微的關系,改變其中一個函數的 實現會影響到其他函數的操作結果。

首先要說的是 Object.ReferenceEquals和Object.Equals這兩個靜態函數,對於它們倆來說, 是不需要進行重寫的,因為它們已經完成它們所要得做的操作。

對於 Object.ReferenceEquals這個靜態函數,函數形勢如下:

public static bool ReferenceEquals( object left, object right );

這個函數就是判斷兩個引用類型對象是否指向同一個地址。有 此說明後,就確定了它的使用范圍,即只能對於引用類型操作。那麼對於任何值類型數據操作,即使是與自身的判別,都會返回false。這主要因為在調用此函 數的時候,值類型數據要進行裝箱操作,也就是對於如下的形式來說。

int n = 10;
Object.ReferenceEquals( n, n );

這是因為對於n這個數據裝箱兩次,而每次裝箱後的地址有不 同,而造成Object.ReferenceEquals( n, n )的結果永遠為false。

對於 第一個判等函數來說,沒有什麼好擴展的,因為本身已經很好地完成了它所要做 的。

對於第二個Object.Equals這個靜態函數,其形式如下:

public static bool Equals( object left, object right );

按照書中對它的分析,其大致函數代碼如下:

public static void Equals( object left, object right )
{
 // Check object identity
 if( left == right )
   return true;
 // both null references handled above
 if( ( left == null ) || ( right == null ) )
   return false;
 return left.Equals( right );
}

可以說, Object.Equals這個函數完成判等操作,需要經過三個步驟,第一步是需要根據 對象所屬類型的==操作符的執行結果;第二步是判別是否為null,也是和第一步 一樣,需要根據類型的==操作符的執行結果;最後一步要使用到類型的Equals函 數的執行結果。也就是說這個靜態函數的返回結果,要取決於後面要提到的兩個 判等函數。類型是否提供相應的判等函數,成為這個函數返回結果的重要因素。

那麼對於Object.Equals這個靜態方法來說,雖說接受參數的類型也屬於 引用類型,但是不同於Object.ReferenceEquals函數,對於如下的代碼,能得出 正確的結果。

int n = 10;
Debug.WriteLine( string.Format( "{0}", Object.Equals( n, n ) ) );
Debug.WriteLine( string.Format( "{0}", Object.Equals( n, 10 ) ) );

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