Речник срещу Hashtable
Речникът е въведен (така че типовете стойности не се нуждаят от кутии), а Hashtable не е (така че типовете стойности се нуждаят от кутии). Hashtable има по-добър начин за получаване на стойност от речника IMHО, защото винаги знае, че стойността е обект. Въпреки че, ако използвате. NET 3.5, е лесно да напишете метод за разширение за речника, за да получите подобно поведение.
Класът Hashtable е специфичен тип речников клас, който използва целочислена стойност (наречена хеш), за да подпомогне съхранението на своите ключове. Класът Hashtable използва хеша, за да ускори търсенето на конкретен ключ в колекцията. Всеки обект в. NET произлиза от класа Обект. Този клас поддържа метода GetHash, който връща цяло число, което уникално идентифицира обекта. Класът Hashtable е много ефективна колекция като цяло. Единственият проблем с класа Hashtable е, че той изисква малко допълнителни разходи, а за малки колекции (по-малко от десет елемента) допълнителните разходи могат да попречат на производителността.
Има още една важна разлика между HashTable и Dictionary. Ако използвате индексатори, за да получите стойност от HashTable, HashTable успешно ще върне null за несъществуващ елемент, докато Речникът ще издаде грешка, ако се опитате да получите достъп до елемент с помощта на индексатор, който не съществува в Речника.
The HashTable е основният клас, който е слабо типизиран; абстрактният клас DictionaryBase е строго въведен и използва вътрешно HashTable.
Странно нещо, забелязано в речника, е, че когато добавяме множество записи в речника, редът, в който се добавят записите, се запазва. По този начин, ако приложите foreach в речника, ще получите записите в същия ред, в който сте ги вмъкнали. Докато това не е вярно с нормалната HashTable, когато добавяте едни и същи записи в Hashtable, редът не се поддържа. Ако „Речникът е базиран на Hashtable“е вярно, защо речникът поддържа реда, а HashTable не го прави?
Що се отнася до причината, поради която се държат по различен начин, това е, защото Generic Dictionary имплементира хеш-таблица, но не е базиран на System. Cоllectiоns. Hashtable. Реализацията на общия речник се основава на разпределяне на двойки ключ-стойност от списък. След това те се индексират с блокчетата на хеш-таблицата за случаен достъп, но когато върне изброител, той просто обикаля списъка в последователен ред – който ще бъде редът на вмъкване, стига записите да не се използват повторно.