【发布时间】:2012-09-26 19:12:13
【问题描述】:
我阅读了this question here,这使我转到了this article here。
我有一个抽象基类,它允许我限制方法只接受扩展我的抽象基类(基本多态性)的类。我的问题是:我可以在我的抽象基类中实现GetHashCode() 来为任何具体实现提供合适的覆盖吗? (即避免在每个具体类中覆盖 GetHashCode()。)
我正在想象我的抽象基类中的一个方法是这样的:
public abstract class FooBase
{
private static readonly int prime_seed = 13;
private static readonly int prime_factor = 7;
public override int GetHashCode()
{
// Seed using the hashcode for this concrete class' Type so
// two classes with the same properties return different hashes.
int hash = prime_seed * this.GetType().GetHashCode();
// Get this concrete class' public properties.
var props = this.GetType().GetProperties(BindingFlags.Public);
foreach (var prop in props)
{
// Factor in each of this concrete class' public properties' hashcodes.
hash = (hash * prime_factor) + prop.GetHashCode();
}
return hash;
}
}
这似乎适用于一些基本的平等单元测试,但我觉得我忽略了一些东西。我仍然必须在每个具体类中提供覆盖以避免编译器警告不要覆盖 GetHashCode(),但至少这样我不必为每个类手动编写实现。
【问题讨论】:
-
似乎涉及散列反射会很慢
-
接下来,我又阅读了一些关于 GetHashCode() 和 Equals() 的实现和使用以及它们之间的关系的内容。在获得了更好的理解之后,我放弃了上面我正在处理的基础 GetHashCode()。排队其中一个旧的 NBC 公益广告:你知道的越多……
-
在
structs中覆盖GetHashCode()总是好的原因之一正是为了避免使用与此相同的一般概念的默认值。它大部分时间都可以工作,但它比大多数简单的GetHashCode()覆盖要慢得多,您可以在不到一分钟的时间内编写代码。
标签: c# abstract gethashcode