Это зависит от , где точно вы хотите проверить на равенство. Ясно, что экземпляры ClassA
и ClassB
никогда не будут "равны" в реальном смысле этого слова, поэтому переопределение поведения Equals
так может привести к некоторым странным ошибкам в вашем коде.
Но если вы хотите сравнить их на основе определенных критериев , то вы можете реализовать определенный IEqualityComparer (или несколько сравнителей), который соответствует вашим потребностям.
Итак, в этом случае вы бы получили:
/// <Summary>
/// Compares two classes based only on the value of their X property.
/// </Summary>
public class ComparerByX : IEqualityComparer<BaseClass>
{
#region IEqualityComparer<BaseClass> Members
public bool Equals(BaseClass a, BaseClass b)
{
return (a.X == b.X);
}
public int GetHashCode(BaseClass obj)
{
return obj.X.GetHashCode();
}
#endregion
}
[Изменить] По поводу комментария:
Обратите внимание, что это не имеет ничего общего с переопределением метода Equals
.
Но вы сможете проверить равенство следующим образом:
IEqualityComparer<BaseClass> comparer = new ComparerByX();
Assert.True(comparer.Equals(a, b));
Поначалу это может показаться не очень хорошим, но дает вам несколько преимуществ:
a) Вы можете иметь столько реализаций IEqualityComparer<T>
, сколько захотите. В зависимости от ситуации может оказаться, что переопределение Equals
не так уж и велико. Тогда вы рискуете сломать весь свой код в зависимости от этого.
b) На самом деле существует множество классов, которые используют IEqualityComparer<T>
для сравнения предметов.
Например, вы можете использовать BaseClass
в качестве ключа в словаре. В этом случае вы бы использовали перегрузку конструктора Dictionary<Key,Value>
, которая принимает IEqualityComparer<T>
:
Dictionary<BaseClass, SomeOtherClass> dictionary
= new Dictionary<BaseClass, SomeOtherClass>(new ComparerByX());
Таким образом, словарь будет использовать пользовательский ComparerByX
во время поиска ключа.
Также, например, если вы используете LINQ, вы можете проверить пример метода Distinct () . Он также поддерживает перегрузку, которая возвращает различные значения, но сравнивается с использованием указанного пользовательского IEqualityComparer
.