[英]Does Equals in c# compare by reference or value?
var A = new obj(1,2,3); //parameters are just used to set some fields no randomness is involved
var B = A;
var C = new obj(1,2,3);
我想確定我的理解是否正確
Equals()
是否比較了2個對象之間所有字段和屬性的值,是否可以肯定地信任它?
Equals()
使用反射嗎?
這取決於你如何寫它。
基礎object.Equals()
方法嚴格按引用比較實例。
您可以在自己的類中重寫Equals()
以執行任何操作。
最后, ValueType.Equals()
(由所有結構繼承)使用反射按值進行比較; 你應該在制作自己的結構時重寫它。
根據MSDN:
當前實例和obj參數之間的比較類型取決於當前實例是引用類型還是值類型。
http://msdn.microsoft.com/en-us/library/bsc2ak47(v=vs.110).aspx
object.Equals
(instance)方法在運行時解析,取決於您比較的類型。
如果比較值類型,它會解析為值比較,如果在引用類型上使用它,則會比較引用。
Equals()
需要由類的編寫者實現。 如果不這樣做,將對引用類型進行引用比較,並對值類型進行值比較。 對於新值類型,強烈建議重寫Equals()
。
根據msdn :如果當前實例是引用類型,則Equals(Object)方法測試引用相等性,並且對Equals(Object)方法的調用等效於對ReferenceEquals方法的調用
您可以在任何實現IEquatable<T>,
類中使用Equals IEquatable<T>,
它具有Equals()方法。 在封面下,在對象上調用GetHashCode()。 因此,您可以擁有兩個具有相同屬性但不相等的對象,因為它們是具有不同哈希碼的不同實例。
為了將自定義類與Equals進行比較,您需要實現IEquatable<T>
接口,並在Equals方法中提供您自己的代碼,例如比較屬性值。
例如:
public class Person : IEquatable<Person>
{
public string FirstName {get;set;}
public string LastName {get;set;}
public bool Equals(Person other)
{
return this.FirstName == other.FirstName
&& this.LastName == other.LastName;
}
public override int GetHashCode()
{
return this.FirstName.GetHashCode() ^ this.LastName.GetHashCode;
}
}
您將需要提供比示例更好的哈希代碼方法。 您現在可以使用Equals()和比較屬性值來比較自定義對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.