C # Hashtable Add vs Indexer - Почему есть оба? - PullRequest
1 голос
/ 26 апреля 2011

Мне известно, что операции Add и присваивания через индексатор в хеш-таблице различаются (т. Е. Последний разрешит перезапись, в то время как первый выдает «Элемент уже добавлен. Исключение Key in dictionary: ...») , Мой вопрос: в какой ситуации может возникнуть необходимость добавить что-то, но, если оно уже есть, выдать исключение?

В частности, похоже, что это просто инкапсуляция еще двух атомарных операций (Содержит и присваивание через индексатор), и я не могу придумать ни одного сценария, в котором я бы хотел, чтобы Microsoft обработала это инкапсулированным способом. .

РЕДАКТИРОВАТЬ: Я полностью поддерживаю идею, что исключительные случаи должны генерировать исключения, и что Add (хотя и просто инкапсуляция) обеспечивает исключение, когда данный ключ уже находится в словаре. Однако, как правило, Hashtables и Словари используются для быстрого поиска по ключам и значениям. Кроме того, большую часть времени, когда я создаю один, у меня уже есть вся доступная коллекция, и я просто переводю ее в словарь.

Пример меня просто поразил ... Я мог бы представить сценарий, в котором вы используете хеш-таблицу (или словарь) для отслеживания сеанса пользователей, вошедших в конкретный сеанс. И если у вас есть конкретное требование, чтобы каждый пользователь мог входить в систему только из одного места за раз (и что они должны выйти из одного сеанса перед повторным входом в систему), тогда вы можете захотеть добавить, потому что он более четко определяет цель код.

Ответы [ 2 ]

3 голосов
/ 26 апреля 2011

Сценарий, в котором поведение исключения является желательным, заключается в том, что вы не ожидаете, что значение будет там когда-либо, так что обнаружение его будет исключением, что свидетельствует о том, что что-то пошло не так.Вы не захотите делать тест Contains для каждого добавленного элемента, если не ожидаете, что ключ уже будет там, верно?

1 голос
/ 26 апреля 2011

Это может быть частью логики приложения, что объект, который вы добавляете, не должен быть там. В случае, если объект уже существует, в коде, вероятно, была допущена ошибка программирования. Случаи, подобные этим, обычно помечаются исключениями или утверждениями. Наличие метода, который вызывает исключение для вас, избавляет от необходимости писать код вроде:

if 'key' in my_dict:
    raise ProgrammingErrorElsewhere()
my_dict['key'] = obj
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...