class Person {
private string _name; //姓名.
private string _id; public string Id {
get { return _id; }
set { _id = value; }
}
public string Name {
get { return _name; }
set { _name = value; }
} //override the "==" operator.
//It does not need the implicit(For it just Compare Two stuff rather than Conversion).
public static bool operator ==(Person p1, Person p2) {
if(p1 == null || p2 == null)
throw new NullReferenceException("Person is Null!");
return (p1.Name == p2.Name && p1.Id == p2.Id);
} public static bool operator !=(Person p1, Person p2) {
return !(p1 == p2);
} //Use the tools to override.
public override bool Equals(object obj) {
return base.Equals(obj);
} //Use the tools to override.
public override int GetHashCode() {
return base.GetHashCode();
}
}有点不明白的是,当我重写运算符时(==,!=).编译器要我还要override Object的 Equals()方法和 HashCode()方法.
为什么哈?还有,该怎么重写哈?
private string _name; //姓名.
private string _id; public string Id {
get { return _id; }
set { _id = value; }
}
public string Name {
get { return _name; }
set { _name = value; }
} //override the "==" operator.
//It does not need the implicit(For it just Compare Two stuff rather than Conversion).
public static bool operator ==(Person p1, Person p2) {
if(p1 == null || p2 == null)
throw new NullReferenceException("Person is Null!");
return (p1.Name == p2.Name && p1.Id == p2.Id);
} public static bool operator !=(Person p1, Person p2) {
return !(p1 == p2);
} //Use the tools to override.
public override bool Equals(object obj) {
return base.Equals(obj);
} //Use the tools to override.
public override int GetHashCode() {
return base.GetHashCode();
}
}有点不明白的是,当我重写运算符时(==,!=).编译器要我还要override Object的 Equals()方法和 HashCode()方法.
为什么哈?还有,该怎么重写哈?
你的意思是,应该这样重写是么?
public static bool operator ==(Person p1, Person p2) {
//if(p1 == null || p2 == null)
if(ReferenceEquals(p1, p2))
throw new NullReferenceException("Person is Null!");
return (p1.Name == p2.Name && p1.Id == p2.Id);
}不是,我没有当它很夸张,只是不理解为什么要重写而已,也就是说,我不知道为什么编译器要提示重写!
sp1234
我查一下资料,说如果 override "==","!=".
编译器会警告,要重写Object 的 Equals() 方法和 HashCode方法.
它解释说: 原因是 Equals 方法应实现与 "=="运算符相同类型的相等逻辑.这是什么意思哈...帮我解释一下...
比如你看string,它重载了==运算符,同时就也重写了object.Equals。除了==和object.Equals,如果你的类型实现了IEquatable<T>,它也应该使用相同的比较逻辑。如果不这样的话,那就乱套了,三种用于比较类型相等性的API返回三种不同的结果。至于GetHashCode,由于它是用来在hash表中分组的,所以对于“相同”的对象,GetHashCode应该返回相同的值。你改变了==和object.Equals的行为,那么GetHashCode的行为也应该改变,否则就不能满足这一要求。所以当你你重写了object.Euqals时编译器会提醒你重写GetHashCode。
[1]前面说==和object.Equals应该保持行为一致,有一个例外。
因为C#没有提供判断引用相等的语法,大部分程序员都习惯了使用==而不是Object.ReferenceEquals来判断引用相等,所以C#中的引用类型最好不要重载==,而是要保持它的默认行为。也就是说object.Equals,IEquatable<T>.Equals使用你的自定义比较逻辑,而==保留默认的对象引用比较。但是反过来,如果你打破这条建议,重载了引用类型的==运算符,那么object.Equals和IEquatable<T>.Equals应该使用和他相同的逻辑。
这里的关键在于三个判断对象相等性API的行为要一致,和递归什么的根本毫无关系