- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
首先,我使用 GetHashCode
算法描述,here .现在,想象以下(人为的)示例:
class Foo
{
public Foo(int intValue, double doubleValue)
{
this.IntValue = intValue;
this.DoubleValue = doubleValue;
}
public int IntValue { get; private set; }
public double DoubleValue { get; private set; }
public override int GetHashCode()
{
unchecked
{
int hash = 17;
hash = hash * 23 + IntValue.GetHashCode();
hash = hash * 23 + DoubleValue.GetHashCode();
return hash;
}
}
}
class DerivedFoo : Foo
{
public DerivedFoo(int intValue, double doubleValue)
: base(intValue, doubleValue)
{
}
}
如果我有一个 Foo
和一个 DerivedFoo
每个属性的值都相同,它们将具有相同的哈希码。这意味着我可以拥有 HashSet<Foo>
或使用 Distinct
Linq 中的方法,这两个实例将被视为相同。
我可能只是误解了 GetHashCode
的用法但我希望这两个实例具有不同的哈希码。这是一个无效的期望还是应该 GetHashCode
在计算中使用类型? (或者 DerivedClass
也应该覆盖 GetHashCode
)?
附言我知道有很多很多关于 SO 的问题与这个主题相关,但我还没有发现一个可以直接回答这个问题的问题。
最佳答案
GetHashCode()
不应该保证唯一性(尽管如果尽可能唯一,它有助于提高性能)。
GetHashCode()
的主要规则是等效对象必须具有相同的哈希码,但这并不意味着非等效对象可以' t 具有相同的哈希码。
如果两个对象具有相同的哈希码,则调用Equals()
方法来查看它们是否相同。由于类型不同(当然取决于您对 Equals 重载的编码方式)它们将不相等,因此没问题。
即使如果您对每种类型有不同的哈希码算法,仍然总是有可能发生冲突,因此也需要Equals()
检查.
现在给出上面的示例,您没有实现 Equals()
这将使每个对象都不同,而不管哈希码如何,因为 Equals()
的默认实现来自object
是引用相等性检查。
如果您还没有,请继续为您的每个类型覆盖 Equals()
(如果您愿意,它们可以继承您的 GetHashCode()
实现,或者有新的),在那里你可以确保比较对象的类型在声明它们相等之前是相同的。并确保始终执行 Equals()
和 GetHashCode()
,以便:
Equals()
的对象必须 具有相同的GetHashCode()
结果。GetHashCode()
的对象必须不是Equals()
。关于c# - GetHashCode 应该取决于类型吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7349599/
我是一名优秀的程序员,十分优秀!