我有以下一些类,我已经为它们中的几乎所有类实现了
1. 我不知道如何根据
2. 如果我为基类(
Equals(Object)
方法。但是我不知道如何编写GetHashCode()
方法。在将这些数据类型用作值类型存储在Dictionary
集合中时,我认为我应该重写GetHashCode()
方法。1. 我不知道如何根据
Equals(Object)
方法的逻辑来实现GetHashCode()
方法。2. 如果我为基类(
Param
)覆盖GetHashCode()
和Equals(Object)
方法,是否仍然需要为子类覆盖它们?class Param
{
...
public Int16 id { get; set; }
public String name { get; set; }
...
public override bool Equals(object obj)
{
if ( obj is Param){
Param p = (Param)(obj);
if (id > 0 && p.id > 0)
return (id == p.id);
else if (name != String.Empty && p.name != String.Empty)
return (name.equals(p.name));
else
return object.ReferenceEquals(this, obj);
}
return false;
}
}
class Item
{
public int it_code { get; set; }
public Dictionary<String, Param> paramAr { get; set; }
...
public override bool Equals(Object obj)
{
Item im = new Item();
if (obj is Item)
im = (Item)obj;
else
return false;
if (this.it_code != String.Empty && im.it_code != String.Empty)
if (this.it_code.Equals(im.it_code))
return true;
bool reParams = true;
foreach ( KeyValuePair<String,Param> kvp in paramAr ){
if (kvp.Value != im.paramAr[kvp.Key]) {
reParams = false;
break;
}
}
return reParams;
}
}
class Order
{
public String or_code { get; set; }
public List <Item> items { get; set; }
...
public override bool Equals( Object obj ){
Order o = new Order();
if (obj is Order)
o = (Order)obj;
else
return false;
if (this.or_code != String.Empty && o.or_code != String.Empty)
if (this.or_code.Equals(o.or_code))
return true;
bool flag = true;
foreach( Item i in items){
if (!o.items.Contains(i)) {
flag = false;
break;
}
}
return flag;
}
}
编辑: 我收到了以下警告:
警告:'Item' 重写了 Object.Equals(object o),但没有重写 Object.GetHashCode()
GetHashCode
时,你唯一需要考虑的是当两个对象通过调用Equals
相等时,它们的哈希码也必须相等。反之,如果两个哈希码相等,并不意味着对象本身相等(尽管它们可能相等)。每当你编写自定义实现Equals
或GetHashCode
的方法时,你都需要为另一个方法编写一些内容,以确保上述逻辑保持正确。 - Matthew