首页 > 学院 > 开发设计 > 正文

Equals相關的一些要點

2019-11-17 02:49:17
字体:
来源:转载
供稿:网友
Equals相關的一些要點

什麽時候需要覆蓋Equals?

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

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

  

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

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

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

  

如何正確的覆蓋Equals?

首先覆蓋Equals的同時還要覆蓋GetHashCode ,爲了確保唯一,可以使用System.Runtime.CompilerServices.RuntimeHelpers類的GetHashCode方法,它能夠返回AppDomain範圍内一個唯一ID

其次還要實現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?

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

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

 

編譯器爲匿名類型重寫了Equal方法,所以用Equal比較兩個相同的匿名對象會得到true; 但直接用==比較則得到false,因爲默認==是按引用來比較的,而匿名類型是不可能重載==


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表