淺析C#判等函數(shù)
.Net有四個(gè)C#判等函數(shù)?不少人看到這個(gè)標(biāo)題,會(huì)對(duì)此感到懷疑,事實(shí)上確是如此,.Net提供了ReferenceEquals、靜態(tài) Equals,具體類型的Equals以及==操作符這四個(gè)C#判等函數(shù)。但是這四個(gè)函數(shù)之間有細(xì)微的關(guān)系,改變其中一個(gè)函數(shù)的實(shí)現(xiàn)會(huì)影響到其他函數(shù)的操作結(jié)果。
首先要說的是Object.ReferenceEquals和Object.Equals這兩個(gè)靜態(tài)函數(shù),對(duì)于它們倆來說,是不需要進(jìn)行重寫的,因?yàn)樗鼈円呀?jīng)完成它們所要得做的操作。對(duì)于Object.ReferenceEquals這個(gè)靜態(tài)函數(shù),函數(shù)形勢(shì)如下:
- public static bool ReferenceEquals( object left, object right );
這個(gè)函數(shù)就是判斷兩個(gè)引用類型對(duì)象是否指向同一個(gè)地址。有此說明后,就確定了它的使用范圍,即只能對(duì)于引用類型操作。那么對(duì)于任何值類型數(shù)據(jù)操作,即使是與自身的判別,都會(huì)返回false.這主要因?yàn)樵谡{(diào)用此函數(shù)的時(shí)候,值類型數(shù)據(jù)要進(jìn)行裝箱操作,也就是對(duì)于如下的形式來說。
- int n = 10;
- Object.ReferenceEquals( n, n );
這是因?yàn)閷?duì)于n這個(gè)數(shù)據(jù)裝箱兩次,而每次裝箱后的地址有不同,而造成Object.ReferenceEquals( n, n )的結(jié)果永遠(yuǎn)為false.
對(duì)于***個(gè)C#判等函數(shù)來說,沒有什么好擴(kuò)展的,因?yàn)楸旧硪呀?jīng)很好地完成了它所要做的。
對(duì)于第二個(gè)Object.Equals這個(gè)靜態(tài)函數(shù),其形式如下:
- public static bool Equals( object left, object right );
按照書中對(duì)它的分析,其大致函數(shù)代碼如下:
- 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 );
- }
【編輯推薦】