c# 相等判断之间的关系

C#提供了四种不同的函数来判断两个对象是否“相等”:
public static bool ReferenceEquals ( object left, object right );//不要重写
public static bool Equals ( object left, object right );//不要重写
public virtual bool Equals( object right);
public static bool operator==( MyClass left, MyClass right );

一:public static bool ReferenceEquals ( object left, object right );
    该方法都判断的是“引用相等”,而非“值相等”,即两个变量指向同一个对象时返回true。当我们使用它来判断值类型时,其结果永远返回false。即使我们将一个值类型和自身进行比较,ReferenceEquals()的返回值仍是false。

二:public static bool Equals ( object left, object right );
    该方法并不知道它们的类型,而“相等判断”又是依赖类型的。答案很简单:该方法会将判断的责任交给其中一个类型来做。事实上,静态Object.Equals()方法的实现如下:
    public static bool Equals( object left, object right )
    {
        // 检查是否引用相等。
        if (left == right )
            return true;
        // 两者同时为null引用的情况在上面已经处理。
        if ((left == null) || (right == null))
            return false;
        return left.Equals (right);
    }

三:public virtual bool Equals( object right);
    Object.Equals()实例方法默认判断的是“引用相等”,其行为和Object.ReferenceEquals()完全一致。
    值类型例外。System.ValueType重写了Object.Equals()方法。ValueType是所有值类型的基类型。如果两个值类型变量的类型相同,并且内容一致,这两个变量才被认为相等。
    public override bool Equals( object right )
    {
        // 检查是否为null:    // 在C#方法中,this指针永远都不可能为null。
        if (right == null)      
            return false;
        //第二个检查会判断两个对象引用是否为同一个对象,即比较对象标识。这是一个非常高效的测试,
        //如果对象引用相等,则对象内容一定相等。
        if (object.ReferenceEquals( this, right ))         
            return true;
        //两个对象的类型是否一致。这种使用GetType()方法进行的精确比较是非常重要的。
        //首先,注意它没有假设this指针的类型为Foo,相反是通过调用this.GetType() 来获取其类型的,因为实际的类型可能继承自Foo。
        //其次,代码检查的是所比较对象的精确类型。仅仅确保将right参数转换为当前类型是不够的。
        if (this.GetType() != right.GetType())          
            return false;
        // 比较两个实例的内容:
        return CompareFooMembers( this, right as Foo );
    }

四:public static bool operator==( MyClass left, MyClass right );


我们永远都不应该重写Object.ReferenceEquals()静态方法和Object.Equals()静态方法[20],因为它们已经提供了正确的判断,且该判断与具体的运行时类型无关。
对于值类型,我们应该总是重写Object.Equals()实例方法和 operator==(),从而为它们提供效率较好的“相等判断”。
对于引用类型,当我们认为相等的含义并非是对象标识相同时,才需要重写 Object.Equals()实例方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值