c#:如何为下面的类类型实现GetHashCode?

时间:2019-05-10 08:23:38

标签: c#

我有一个与以下相似的课程:

class Abc
{
     public string A {get;set;}
     public string B {get;set;}
}

等于的标准是A或B中的任何一个是否匹配两个Abc类的对象应匹配。

public override bool Equals (Abc obj)
{
      if (obj.A == A || obj.B == B)
           return true;
      else return false;
}

任何人都可以让我知道在这种情况下什么样的GetHashCode函数将提供相等的值。

因为A和B字段的值可能相同,也可能不同。

1 个答案:

答案 0 :(得分:5)

实现GetHashCode的唯一且唯一的要求是,当两个对象被认为相等时(即Equals返回true),则它们的哈希码必须匹配。

在您的情况下,如果您有两个不同的对象,它们的x =(A1,B1)和y =(A2,B2),则它们的哈希码必须相同,因为它必须与z =(A1, B2),因为x和z相等,因此y和z也相等。因此,GetHashCode的唯一有效实现是始终返回一个常数,例如0。

您可能会奇怪,因为仅返回一个常数的GetHashCode实现是没有意义的,这是事实。原因是您的Equals也没有意义。您最大的问题是Equals不可传递。 x和z相等,z和y相等,但x和y不相等。这与您的预期相反。