Я должен переопределить GetHashCode () на ссылочных типах?

Используйте p.poll() или, если вам нужно проверить вывод, используйте subprocess.PIPE для стандартного выхода и select() на p.stdout.

18
задан 20 April 2009 в 18:15
поделиться

3 ответа

Вам нужно только переопределить GetHashCode () для ссылочных типов, если вы переопределяете Object.Equals ().

Причина этого проста - обычно 2 ссылки всегда будут отличаться (a.Equals (b) == false, если только они не являются одним и тем же объектом) ). Реализация по умолчанию GetHashCode () предоставит 2 различных хеша в этом случае, так что все хорошо.

Однако, если вы переопределите Equals (), это поведение не гарантируется. Если два объекта равны (согласно Equals ()), вы должны гарантировать, что они будут иметь одинаковый хеш-код с GetHashCode, поэтому вы должны переопределить его.

17
ответ дан 30 November 2019 в 09:11
поделиться

Я только что сделал пример теста, и я не вижу, как он начинается с 1 и получает приращение.

for (int i = 0; i < 16; i++)
{
    object obj = new object();
    Console.Write(obj.GetHashCode() + " ");
}

с такими результатами:

45653674 41149443 39785641 45523402 35287174 44419000 52697953 22597652 
10261382 59109011 42659827 40644060 17043416 28756230 18961937 47980820

На самом деле, используя Reflector, я мог видеть только следующее:

internal static extern int InternalGetHashCode(object obj);

Итак, как это на самом деле происходит, для меня загадка (может быть шаблон, но я не собираюсь копать глубже в этой точке - может быть, какой-то алгоритм «псевдослучайного числа» ?). Кто-то из команды CLR мог бы ответить на этот вопрос.

Что касается других вопросов, то Рид действительно побил меня: « GetHashCode и « Равно ». На странице MSDN это описано с несколькими более кровавыми подробностями, на всякий случай.

0
ответ дан 30 November 2019 в 09:11
поделиться

Взгляните на комментарий, который я оставил к статье: Метод расширения GetHashCode

0
ответ дан 30 November 2019 в 09:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: