以C#为例。
重写Equals的基本原则:
- 同一性:x.Equals(x)为true,通过ReferenceEquals(this, obj)实现;
- 自反性:x.Equals(y) == y.Equals(x),通过this.GetType() == obj.GetType()判断类型是否相同,再进一步对属性进行判断;
- 传递性:If x.Equals(y) == true && yEquals(z) == true,Then x.Equals(z) == true;
- x.Equals(null)必须返回false,通过ReferenceEquals(obj, null)实现。
Equals与==的区别:
- 一般Equals判断内容,==判断地址;
- 在Object基类中,Equals调用==,所以也是判断的地址;
- 重写Equals而不重载==,不会有警告,且此时调用==的话其实是调用的Object的==,而不会调用重写的Equals;
- 重载==而不重写 Equals,会有警告,且此时调用Equals会调用重载的==。
注意
- 不要在重载==的时候通过a==null、b==null、a==b的方式来判断引用的相等性,这会引起调用的死循环,用ReferenceEquals(a,b)来代替。
- 重载==、!=成对出现;重写了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);
}
}