簡體   English   中英

c#中的等於按引用或值進行比較嗎?

[英]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); 

我想確定我的理解是否正確

  • A.Equals(B).Equals(C)(true)
  • A == C(假)
  • A == B(真)

Equals()是否比較了2個對象之間所有字段和屬性的值,是否可以肯定地信任它?

Equals()使用反射嗎?

這取決於你如何寫它。

基礎object.Equals()方法嚴格按引用比較實例。

您可以在自己的類中重寫Equals()以執行任何操作。

最后, ValueType.Equals() (由所有結構繼承)使用反射按值進行比較; 你應該在制作自己的結構時重寫它。

根據MSDN:

當前實例和obj參數之間的比較類型取決於當前實例是引用類型還是值類型。

  • 如果當前實例是引用類型,則Equals(Object)方法測試引用相等性,並且對Equals(Object)方法的調用等效於對ReferenceEquals方法的調用。 引用相等意味着比較的對象變量引用同一個對象。
  • 如果當前實例是值類型,則Equals(Object)方法將測試值相等性。

http://msdn.microsoft.com/en-us/library/bsc2ak47(v=vs.110).aspx

object.Equals (instance)方法在運行時解析,取決於您比較的類型。

如果比較值類型,它會解析為值比較,如果在引用類型上使用它,則會比較引用。

http://msdn.microsoft.com/en-us/library/bsc2ak47.aspx

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM