Любая идея, почему это поведение отличается?
Почему словарь [index] бросает исключение KeyNotFoundException, но Hashtable [index] нет?
Ответ 1
Здесь answer.
Основная причина Словарь бросает, что нет "ошибки", ценность, которая работает над любым V. Hashtable может возвращать null потому что ключ всегда является ссылкой тип.
Ответ 2
Таким образом, не будет никакой двусмысленности между тем, когда значение словаря [ключ] сохраняет нулевое значение и когда ключ не существует. Hashtable [key] возвращает null, если он сохраняет значение null или ключ не существует.
Ответ 3
Основная причина, по которой словарные броски являются политическими, - имеет несколько вариантов сохранения эффективности и удобства использования. Он фактически предоставляет метод (TryGetValue), который наглядно демонстрирует, что утверждения о предполагаемой "неспособности" вернуть разумную ценность ложны. TryGetValue, тем не менее, вынуждает явно неудобный синтаксис делать то, что мог сделать прожектор.
Шаблоны С# обеспечивают простой способ построения отдельных реализаций для ссылочной и семантической семантики и есть два других объекта для бесшовной обработки отсутствующих объектов с семантикой значений, которые используются tempates и некоторыми операторами (по умолчанию и с возможностью NULL). Это означает, что не было разумной причины разрушить семантику хэш-таблицы.
Это длительная политическая борьба между академическим понятием коллекции, которая настаивает на том, что каждый должен пройти проверку "есть ли у вас" и реальный факт, что такая искусственная процедура неэффективна и нарушает безопасность потоков - в принципе ( он нарушает безопасность потоков в других безопасных реализациях, делая acces неатомными).