原文發表於 2008-07-30 23:06:34 在我的網易部落格,後被我刪掉(主要是想把網易部落格上的技術相關的文章都搬過來)
最近一直在看<Pro c# with .NET 3.0, Special Edition>,第三章3.18.5節中講述了System.Object的靜態成員的Equals方法和ReferenceEquals方法,按照這本書的說法,Object.Equals(Object1,Object2)是用來比較兩個對象(屬於同一類型)的狀態是否相同.下面是其舉例:
Person person3=new Person("Fred","Jones","222-22-2222",98);
//Person 類有4個屬性:fName(String),lName(String),SSN(String),age(byte)
Person person4=new Person("Fred","Jones","222-22-2222",98);
按照其說法,person3和person4有相同的狀態,因此,object.Equals(person3,person4)的傳回值應該是True,然而,我在Visual studio 2005中編譯後得到的結果卻是:False.真是叫人很吃驚.後來我在網上查了一下object.Equals方法,一篇文章這樣寫:
用反編譯工具反編譯System.dll得到方法的實現源碼:
public static bool Equals(object objA, object objB)
{
if (objA == objB)
{ return true; }
if ((objA != null) && (objB != null))
{ return objA.Equals(objB); }
return false;
}
可以看到,兩個對象是否Equals,就要看其用等號判斷的值是否相等.而等號判斷兩個對象是否相等是看他們兩個對象是否有相同的引用(是否指向的是記憶體中的同一個對象的位置).雖然兩個對象狀態相同,但是,並沒有指向記憶體中相同地區,不屬於相同引用.因此傳回值是False.