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; }}
编辑:
我收到这个警告:
解决方法 首先,正如我所知,无论你在哪里实现Equals,你都必须实现GetHashCode. GetHashCode的实现必须反映Equals实现的行为,但通常不会使用它.Warning : ‘Item’ overrIDes Object.Equals(object o) but does not
overrIDe Object.GetHashCode()
见http://msdn.microsoft.com/en-us/library/system.object.gethashcode.aspx – 特别是“对实施者的说明”
因此,如果您以Equals的Item实现为例,您将考虑ID和name的值来影响相等性.因此,这两者必须有助于GetHashCode实现.
您可以如何为Item实现GetHashCode的示例将如下所示(请注意,您可能需要使其具有对可空名称字段的d性):
public overrIDe GetHashCode(){ return ID.GetHashCode() ^ name.GetHashCode();}
请参阅Eric lippert关于GetHashCode指南的博客文章 – http://ericlippert.com/2011/02/28/guidelines-and-rules-for-gethashcode/
至于你是否需要在子类中重新实现GetHashCode – 是的,如果你也重写等于 – 按照第一个(和主要的)点 – 两者的实现必须是一致的 – 如果两个项被认为等于等于那么它们必须从GetHashCode返回相同的值.
边注:
作为代码的性能改进(避免多次转换):
if ( obj is Param){ Param p = (Param)(obj);Param p = obj as Param;if (p != null) ...总结
以上是内存溢出为你收集整理的c# – 如何使用覆盖逻辑Equals()实现GetHashCode()的覆盖全部内容,希望文章能够帮你解决c# – 如何使用覆盖逻辑Equals()实现GetHashCode()的覆盖所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)