Почему Dictionary [index] создает исключение KeyNotFoundException, а Hashtable [index] - нет? - PullRequest
14 голосов
/ 10 ноября 2009

Есть идеи, почему это поведение отличается?

Ответы [ 3 ]

18 голосов
/ 10 ноября 2009

Вот ответ .

Словарь основных причин броски в том что нет "ошибки" значение, которое работает над любым V. Hashtable может вернуть ноль потому что ключ всегда является ссылкой типа.

6 голосов
/ 10 ноября 2009

Таким образом, не будет никакой двусмысленности между тем, когда значение словаря [ключ] хранит нулевое значение, и когда ключ не существует. Hashtable [ключ] вернет ноль, если он хранит ноль или ключ не существует.

2 голосов
/ 21 июля 2010

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

Шаблоны C # обеспечивают простой способ создания отдельных реализаций для семантики ссылок и значений, и есть два других средства для плавной обработки отсутствующих объектов с семантикой значений, которые используются шаблонами и некоторыми операторами (по умолчанию и допускают обнуляемость). Это означает, что не было разумной причины нарушать семантику хеш-таблицы.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...