程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> Equals相關的一些要點,Equals

Equals相關的一些要點,Equals

編輯:C#入門知識

Equals相關的一些要點,Equals


  • 什麽時候需要覆蓋Equals?

自定義的值類型需要覆蓋,因爲系統默認的實現是基於反射的,效率不高。

自定義的引用類型要根據業務需要來決定是否提供覆蓋。

 

  • 什麽時候需要覆蓋operator==()?

自定義的值類型需要覆蓋,原因和Equals一樣。

自定義的引用類型一般不要覆蓋,因爲框架的默認語義是按引用比較。

 

  • 如何正確的覆蓋Equals?

首先覆蓋Equals的同時還要覆蓋GetHashCode

其次還要實現IEquatable<T>接口,該接口實現類型安全的比較

所以基本上一個標準實現如下:

    class Foo : IEquatable<Foo>
    {
        public override int GetHashCode()
        {
            //add logic here...
        }

        public override bool Equals(object obj)
        {
            if (obj == null) return false;
            if (object.ReferenceEquals(this, obj)) return true;
            if (this.GetType() != obj.GetType()) return false;

            return this.Equals(obj as Foo);
        }

        public bool Equals(Foo other)
        {
            //add logic here...
        }
    }

 

  • 什麽時候需要實現IStructuralEquatable?

自定義的集合對象或者組合對象可以考慮實現該接口,以實現基於內容的比較。

框架默認爲數組和元組提供了該接口的實現,這樣就不會衹按引用比較,而是按內部元素的值進行比較。

 


==與equals方法有什不同

貌似equals是java裡的。
==是表示兩個對象值相等,如1==1
equals是表示兩個元素是同一個對象引用,如A.equals(A)為真,new A().equals(new A())為假
 

對於JAVA中equals與“==”問題

==運算符對於對象來說只會比較對象是否是同一個,而不是比較內容。String的equals是從Object繼承過來的,但重寫過,比較的是內容。
所以
a.equals(b)為true
c.equals(d)為ture
a==b 為true 應該是編譯器對a和b的定義進行優化的結果
String a = “ab”;String b = “ab”;這裡定義的都是常量,編譯器會對常量進行優化,最終可能會優化成
public static final String xxx = "ab";
String a = xxx;
String b = xxx;
這裡就變成了變量a和變量b引用的是同一個對象,你可以反編譯class文件過來看看。
至於c==d 為false這個通過上面的解釋應該就能理解了。
這個跟強轉沒有關系,強轉了之後只是引用的變量聲明改變了,實際對象沒有變化,調用的equals還是String的equals,所以都是true。
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved