为什么在重写 Equals 时必须重写 GetHashCode?
大家好!我是一名初学 C# 的开发者,对 Equals 和 GetHashCode 方法感到困惑。
我创建了一个简单的 `Person` 类,包含 `Name` 和 `Age` 字段。我需要两个对象在这些字段相同时被视为相等。因此我重写了 `Equals` 方法:
```csharp
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public override bool Equals(object obj)
{
if (obj == null || GetType() != obj.GetType())
return false;
Person other = (Person)obj;
return Name == other.Name && Age == other.Age;
}
}
```
当我直接比较对象时,一切正常:`person1.Equals(person2)` 对相同数据返回 `true`。但当我尝试在 `HashSet` 中使用这个类时,我注意到了奇怪的行为。即使两个 `Person` 对象包含相同的 Name 和 Age,`HashSet` 也认为它们不同,并同时添加两者。例如:
```csharp
Hash