Быстрый вопрос о ссылочном типе вводит универсальный словарь в .NET

У меня есть изменяемый класс, который я использую в качестве ключа к универсальному словарю. Два ключа должны быть равными, только если их ссылки равны. Из того, что я читал, в этом случае, я не должен переопределять, Равняется, GetHashCode или реализация IEqualityComparer.

Это корректно?

7
задан Jules 16 March 2010 в 15:32
поделиться

5 ответов

Да. Операция сравнения по умолчанию в System.Object использует ссылочное равенство. Если это то, что вы хотите, настройки по умолчанию должны работать нормально.

16
ответ дан 6 December 2019 в 11:48
поделиться

Да, это правильно. До тех пор, пока вы не переопределяете, ссылка является сравнением по умолчанию.

1
ответ дан 6 December 2019 в 11:48
поделиться

Я добавлю к тому, что все здесь сказали (да), но еще одним моментом, который, кажется, здесь никто не упомянул.

При использовании общих коллекций (Dictionary, List и т. Д.) Вы можете переопределить IEquatable , чтобы предоставить версию для конкретного типа, которая может выполнять ваше сравнение без бокса или преобразования вверх / вниз. Эти общие коллекции будут использовать эту перегрузку, если она присутствует, для сравнений, и это может быть немного более эффективным.

Как отмечено в документации, при реализации IEquatable вы по-прежнему должны переопределить Equals / Hashcode из Object.

1
ответ дан 6 December 2019 в 11:48
поделиться

Как все остальные уже отметили, да, вы правы. Фактически, вы определенно не хотите переопределить члены равенства, если ваш тип изменяемый (у него есть сеттеры). Но если вы хотите иметь проверку равенства, которая использует значения в вашем типе, вы можете сделать свой тип неизменяемым (например, String ), убедившись, что нет установщиков (только конструктор устанавливает значения). Или используйте структуру .

0
ответ дан 6 December 2019 в 11:48
поделиться

Да, вы правы, выполняя == сравнение (или .Equals) двух объектов, сравнивая их ссылки, если не указана другая перегрузка.

String s = "a";

object test1 = (object)s;
object test2 = (object)s;

Debug.Assert(test1.Equals(test2));
-1
ответ дан 6 December 2019 в 11:48
поделиться