【发布时间】:2012-04-07 08:19:14
【问题描述】:
我有一些类如下,我已经为几乎所有类实现了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的自定义实现时,您都必须为其他方法编写一些内容,以确保我在上面解释的逻辑保持正确。 -
Visual Studio 现在可以帮助解决这个问题 docs.microsoft.com/en-us/visualstudio/ide/reference/…
标签: c# overriding gethashcode