У меня есть изменяемый класс, который я использую в качестве ключа к универсальному словарю. Два ключа должны быть равными, только если их ссылки равны. Из того, что я читал, в этом случае, я не должен переопределять, Равняется, GetHashCode или реализация IEqualityComparer.
Это корректно?
Да. Операция сравнения по умолчанию в System.Object использует ссылочное равенство. Если это то, что вы хотите, настройки по умолчанию должны работать нормально.
Да, это правильно. До тех пор, пока вы не переопределяете, ссылка является сравнением по умолчанию.
Я добавлю к тому, что все здесь сказали (да), но еще одним моментом, который, кажется, здесь никто не упомянул.
При использовании общих коллекций (Dictionary, List и т. Д.) Вы можете переопределить IEquatable , чтобы предоставить версию для конкретного типа, которая может выполнять ваше сравнение без бокса или преобразования вверх / вниз. Эти общие коллекции будут использовать эту перегрузку, если она присутствует, для сравнений, и это может быть немного более эффективным.
Как отмечено в документации, при реализации IEquatable вы по-прежнему должны переопределить Equals / Hashcode из Object.
Как все остальные уже отметили, да, вы правы. Фактически, вы определенно не хотите переопределить члены равенства, если ваш тип изменяемый (у него есть сеттеры). Но если вы хотите иметь проверку равенства, которая использует значения в вашем типе, вы можете сделать свой тип неизменяемым (например, String
), убедившись, что нет установщиков (только конструктор устанавливает значения). Или используйте структуру
.
Да, вы правы, выполняя == сравнение (или .Equals) двух объектов, сравнивая их ссылки, если не указана другая перегрузка.
String s = "a";
object test1 = (object)s;
object test2 = (object)s;
Debug.Assert(test1.Equals(test2));