首页 > 代码库 > Equals相關的一些要點
Equals相關的一些要點
什麽時候需要覆蓋Equals?
自定義的值類型需要覆蓋,因爲系統默認的實現是基於反射的,效率不高。
自定義的引用類型要根據業務需要來決定是否提供覆蓋。
什麽時候需要覆蓋operator==()?
自定義的值類型需要覆蓋,原因和Equals一樣。
自定義的引用類型一般不要覆蓋,因爲框架的默認語義是按引用比較。
如何正確的覆蓋Equals?
首先覆蓋Equals的同時還要覆蓋GetHashCode
其次還要實現IEquatable<T>接口,該接口實現類型安全的比較
所以基本上一個標準實現如下:
class Foo : IEquatable<Foo> { public override int GetHashCode() { return base.GetHashCode(); } 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... return true; } }
什麽時候需要實現IStructuralEquatable?
自定義的集合對象或者組合對象可以考慮實現該接口,以實現基於内容的比較。
框架默認爲數組和元組提供了該接口的實現,這樣就不會衹按引用比較,而是按内部元素的值進行比較
Equals相關的一些要點
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。