码迷,mamicode.com
首页 > 其他好文 > 详细

Equals相關的一些要點

时间:2014-10-20 19:10:12      阅读:133      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   sp   div   log   ad   ef   bs   

  • 什麽時候需要覆蓋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相關的一些要點

标签:style   blog   color   sp   div   log   ad   ef   bs   

原文地址:http://www.cnblogs.com/yetsen/p/4037969.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!