Реализация по умолчанию == использует ссылочное равенство на ссылочных типах, то есть объекты равны тогда и только тогда, когда они являются одним и тем же экземпляром.
Вы можете перегрузить операторы ==
и !=
. Если вы сделаете это, для согласованности вы также должны переопределить Equals
и GetHashCode()
. Если вы не переопределите их, вы получите правильное равенство только с помощью ==
и !=
, но во многих других случаях, таких как Dictionary
или HashSet
, все равно будет использоваться ссылочное равенство.
Вам всегда нужно перегружать ==
и !=
вместе. Обычно я записываю само сравнение в ==
и выражаю другие сравнения, используя ==
.
public static bool operator ==(MyClass x, MyClass y)
{
}
public static bool operator !=(MyClass x, MyClass y)
{
return !(x==y);
}
public override bool Equals(object obj)
{
if((obj==null)||(obj.GetType()!=typeof(MyClass))
return false;
return this==(MyClass)obj;
}
public override int GetHashCode()
{
}
И вам следует подумать о том, чтобы сделать класс неизменным. Равенство не должно изменяться, пока объект находится внутри HashSet или Dictionary, и его полная неизменность экономит много проблем. А поскольку вы можете достичь семантики значений только с помощью неизменяемых классов, и целью переопределения равенства является получение семантики значений, вам в основном нужна неизменность.