淺析C#判等函數
.Net有四個C#判等函數?不少人看到這個標題,會對此感到懷疑,事實上確是如此,.Net提供了ReferenceEquals、靜態 Equals,具體類型的Equals以及==操作符這四個C#判等函數。但是這四個函數之間有細微的關系,改變其中一個函數的實現會影響到其他函數的操作結果。
首先要說的是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.
對于***個C#判等函數來說,沒有什么好擴展的,因為本身已經很好地完成了它所要做的。
對于第二個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 );
- }
【編輯推薦】