Часто вам приходится возвращаться к методологиям и методам C ++, чтобы полностью понять, как и почему .NET Framework работает особым образом.
В C ++ вам часто приходится выбирать ключ, который не будетused - словарь использует этот ключ для указания на удаленные и / или пустые записи.Например, у вас есть словарь <int, int>
, и после вставки записи вы удаляете ее.Вместо того, чтобы сразу же запустить уборку мусора, реструктурировать словарь и привести к снижению производительности;словарь просто заменит значение KEY на ключ, который вы ранее выбрали, в основном это означает, что «когда вы пересекаете пространство памяти словаря, притворитесь, что эта пара <key,value>
не существует, не стесняйтесь перезаписать ее».
Такой ключ также используется в словарях, которые предварительно выделяют пространство в сегментах определенным образом - вам нужен ключ для «инициализации» блоков вместо того, чтобы иметь флаг для каждой записи, который указывает, является ли его содержимое допустимым.Таким образом, вместо тройки <key, value, initialized>
у вас будет кортеж <key, value>
с правилом: если key == empty_key, то он не был инициализирован, и поэтому вы не можете использовать empty_key в качестве действительного значения KEY.
Подобное поведение вы можете увидеть в хеш-таблице Google (словарь для вас .NET) :) в документации здесь: http://google -sparsehash.googlecode.com / svn / trunk / doc / dens_hash_map.html
Посмотрите на функции set_deleted_key
и set_empty_key
, чтобы понять, о чем я говорю.
Я бы сказал, что .NET использует NULL в качестве уникального ключа delete_key илиempty_key для выполнения таких хитрых уловок, которые улучшают производительность.