Только если они используются в качестве ключа и вы не хотите основывать эквивалентность на экземпляре самого объекта. Если вы хотите, чтобы ссылки на точно такой же экземпляр были эквивалентными, у вас все в порядке и вам ничего не нужно делать, но если вы используете свой тип в качестве ключа и хотите, чтобы «эквивалентные» экземпляры считались равными, ваш класс должен реализовать Equals()
и GetHashCode()
.
Если ваш пользовательский тип хранится как значение и не используется в качестве ключа, это, разумеется, не обязательно. Например, в этом случае MyType не нужно переопределять Equals()
или GetHashCode()
, поскольку он используется только как значение, а не как ключ хранения.
Dictionary<string, MyType> x;
Однако в этом случае:
Dictionary<MyType, string> x;
Ваш пользовательский тип является ключом, и поэтому он должен переопределить Equals()
и GetHashCode()
. GetHashCode()
используется для определения местоположения, в котором он хэшируется, а Equals()
используется для разрешения коллизий в хэш-коде (среди прочего).
Вам нужно будет переопределить два одинаковых метода, когда вы также имеете дело со многими LINQ
запросами. Кроме того, вы можете предоставить отдельную IEqualityComparer
отдельно от вашего класса, чтобы определить, эквивалентны ли два экземпляра.