C#中的相等性判断(RefrenceEquals、Equals)

来源:互联网 发布:人工智能概念股及代码 编辑:程序博客网 时间:2024/06/08 16:17
///        ///等同性的数学定义:自反、对称、传递        ///                ///        /// RefrenceEqual:        ///     static bool ReferenceEquals(object objA, object objB);        ///     值类型调用永远返回false(原因在于装箱)        ///     如果两个变量指向同一个对象(具有相同的对象标识),则为true        ///     对象标识:系统创建的每一个对象在创建时系统都会分配一个唯一        ///     的对象键(一个整数值,保存在Object的一个内部变量中),        ///     这个值在Object的构造函数中设置,并且之后不会再更改,        ///     Object的GetHashCode()会返回该值做散列码        ///                ///        /// Equals:        ///     static bool Equals(object objA, object objB)        ///     当不知道两个变量的运行时类型时使用此方法,不管值类型还是引用类型        ///     该方法会将判断的具体操作委托给其中的一个类型来处理        ///     其实现如下:        ///        public static bool Equals(object objA, object objB)        {            if (Object.ReferenceEquals(objA, objB))                 return true;            if (Object.ReferenceEquals(objA, null) || Object.ReferenceEquals(objB, null))                 return false;            return objA.Equals(objB);        }        ///        /// 永远不要重定义上面的两个静态方法        ///        ///        /// 实例方法 Equals:        ///     override bool Equals(object obj)        ///     virtual bool Equals(object obj),当Object的实例方法Equals的行为与我们的类型        ///     不一致时,我们需要覆写。        ///     Equals默认判断两个对象的是否引用相等,也就是说和静态方法RefrenceEquals行为        ///     完全一致。        ///             ///     但值类型例外,System.ValueType重写了该方法,如果两个值类型变量的        ///     类型相同并且内容一致,则为相等。        ///     ValueType是所有值类型(Struct关键字创建的类型)的基类,为了提供正确的行为,        ///     它必须在不知道所有成员变量运行时类型的情况下,比较其派生类型中的        ///     所有成员(这意味着使用反射),所以ValueType.Equals方法效率并不高。        ///     因此,我们总是应该为自己定义的值类型提供一个高效的Equals覆写。        ///             ///     对于引用类型,我们在希望改变其默认行为时才应该覆写Equals实例方法,        ///     比如某个类型需要比较其内容而不是对象标识(如string的等同判断)        ///     重写Equals方法总应该为该类型实现IEquatable<T>接口        ///     如下        ///        public class Customer : IEquatable<Customer>        {            public override bool Equals(object obj)            {                if (object.ReferenceEquals(obj, null))                    return false;                if (object.ReferenceEquals(this, obj))                    return true;                // 此处总应该使用GetType来获取this的运行时类型(因为可能是派生实例)                if (this.GetType() != obj.GetType())                    return false;                return this.Equals(obj as Customer);            }            public bool Equals(Customer customer)            {                // 比较各字段内容,省略                return true;            }        } 


 

原创粉丝点击