Кажется, что это всегда просто "работает" без необходимости что-либо делать.
Вы не сказали нам, используете ли вы типы значений или ссылочные типы для ваших ключей.
Если вы используете типы значений, реализация по умолчанию Equals
и GetHashCode
в порядке (Equals
проверяет, равны ли поля, а GetHashCode
основан на полях (необязательно)все они!)).Если вы используете ссылочные типы, реализация по умолчанию Equals
и GetHashCode
использует равенство ссылок, что может быть или не быть правильным;это зависит от того, что вы делаете.
Единственное, о чем я могу думать, это то, что у каждого класса есть скрытый вид статического идентификатора, который использует Object.GetHashCode
.
Нет.По умолчанию используется хэш-код, основанный на полях для типа значения и ссылки для ссылочного типа.
(кроме того, кто-нибудь знает, как реализован Object.GetHashCode? Я не смог найтиэто в .NET Reflector)
Это деталь реализации, которую вы никогда не должны знать и никогда не полагаетесь на нее.Он может измениться в любой момент.
Я никогда не переопределял GetHashCode, но я читал вокруг, и люди говорят, что вам нужно только при переопределении Equals и предоставлении пользовательской проверки на равенство для вашего приложения, так что я думаюЯ в порядке?
Ну, для вас нормально равенство по умолчанию?Если нет, переопределите Equals
и GetHashCode
или implmenet IEqualityComparer<T>
для вашего T
.
Я все еще хотел бы знать, как работает магия, хотя = P
Каждый объект имеет Equals
и GetHashCode
.Реализации по умолчанию следующие:
- Для типов значений
Equals
- равенство значений. - Для ссылочных типов
Equals
- равенство ссылок. - Для типов значений
GetHashCode
основано на полях (опять же, не обязательно на всех!). - Для ссылочных типов
GetHashCode
основано на ссылке.
Если вы используете перегрузку конструктора Dictionary
, который не принимает IEqualityComparer<T>
для вашего T
, он будет использовать EqualityComparer<T>.Default
.Это IEqualityComparer<T>
просто использует Equals
и GetHashCode
.Итак, если вы не переопределили их, вы получите реализации, как определено выше.Если вы переопределите Equals
и GetHashCode
, то это то, что EqualityComparer<T>.Default
будет использовать.
В противном случае передайте пользовательскую реализацию IEqualityComparer<T>
в конструктор для Dictionary
.