由於結構類型是值類型,因而Equals()方法比較的是兩個對象的值是否相等,如果相等則返回true;而類類型為引用類型,Equals()方法比較的是二者的引用地址(即指針)是否相等。很顯然,clsX和clsY是兩個不同的對象,它們在棧的地址是不相等的。如果修改代碼如下:
ClassPerson clsX = new ClassPerson();
clsX.LastName = "Bejaoui";
clsX.FirstName = "Bechir";
ClassPerson clsY = clsX;
if (clsX.Equals(clsY))
{
Console.WriteLine("clsX = clsY");
}
else
{
Console.WriteLine("clsX != clsY");
}//This code displays clsX = clsY
由於是直接將clsX賦值給clsY,因此兩個對象的引用地址相等,Equals()方法返回true。
其實對於值類型和引用類型的相等性比較,是一個比較復雜的問題。例如我們可以通過重寫Equals()方法增強或修改比較邏輯。重寫Equals()方法還必須重寫GetHashCode()方法。對於引用類型,還可以使用靜態方法ReferenceEquals()方法。此外,還可以重載操作符==。另外,對於String對象,則比較特殊,因為它使用了Immutable模式。雖然String類型是引用類型,但如果直接定義的兩個String對象的值相同,由於采用了Immutable模式的原因,這兩個對象其實是同一個對象,引用地址是相同的。因此不僅動態方法Equals()返回的是true,且靜態方法ReferenceEquals()返回的也是true。