Мне было интересно об этом, поэтому я решил спросить.
В большинстве мест, которые вы увидите, используется та же семантическая логика для переопределения Equals, что и для GetHashCode для членского равенства ... однако обычно онииспользуйте разные реализации:
public override bool Equals(object obj)
{
if (obj == null || GetType() != obj.GetType())
{
return false;
}
var other = (MyType)obj;
if (other.Prop1 != Prop1)
{
return false;
}
return true;
}
public override int GetHashCode()
{
int hash = -657803396;
num ^= Prop1.GetHashCode();
return num;
}
Если вы реализуете равноправное членство для своего типа (скажем, для сохранения в словаре), почему бы просто не переопределить GetHashCode, а затем сделать что-то подобное для Equals:
public override bool Equals(object obj)
{
return this.HashEqualsAndIsSameType(obj);
}
public static bool HashEquals(this object source, object obj)
{
if (source != null && obj != null)
{
return source.GetHashCode() == obj.GetHashCode();
}
if (source != null || obj != null)
{
return false;
}
return true;
}
public static bool HashEqualsAndIsSameType<T>(this T source, object obj)
{
return (obj == null || obj.GetType() == typeof(T)) && source.HashEquals(obj);
}