重写Equals、==的区别

以C#为例。

重写Equals的基本原则:

  1. 同一性:x.Equals(x)为true,通过ReferenceEquals(this, obj)实现;
  2. 自反性:x.Equals(y) == y.Equals(x),通过this.GetType() == obj.GetType()判断类型是否相同,再进一步对属性进行判断;
  3. 传递性:If x.Equals(y) == true && yEquals(z) == true,Then x.Equals(z) == true;
  4. x.Equals(null)必须返回false,通过ReferenceEquals(obj, null)实现。

Equals与==的区别:

  1. 一般Equals判断内容,==判断地址;
  2. 在Object基类中,Equals调用==,所以也是判断的地址;
  3. 重写Equals而不重载==,不会有警告,且此时调用==的话其实是调用的Object的==,而不会调用重写的Equals
  4. 重载==而不重写 Equals,会有警告,且此时调用Equals会调用重载的==

注意

  1. 不要在重载==的时候通过a==null、b==null、a==b的方式来判断引用的相等性,这会引起调用的死循环,用ReferenceEquals(a,b)来代替。
  2. 重载==、!=成对出现;重写了Equals就必须重写GetHashCode以保证高层模块的正确调用。

代码示例

 public class Node
 {
    public string No { get; set; }
        
    public string Birth { get; set; }
        
    public override bool Equals(object obj)
    {
        if (ReferenceEquals(obj, null))
            return false;
        if (ReferenceEquals(this, obj))
            return true;
        if (this.GetType() != obj.GetType()
            return false;

        Nodemodel = obj as Node;
        return this.No == model.No ;
    }

    public override int GetHashCode()
    {
        return No == null ? 0 : No.GetHashCode();
    }

    public static bool operator ==(InoculatorNode i1, InoculatorNode i2)
    {
        return Equals(i1, i2);
    }

    public static bool operator !=(InoculatorNode i1, InoculatorNode i2)
    {
        return !Equals(i1, i2);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值