История вопроса
C появлением .NET Framework, Visual Basic получил типобезопасную и быстродействующую структуру хранения пар ключ-значение — Dictionary(Of TKey, TValue). Это стандартный ассоциативный контейнер для быстрого поиска.
Проблема
Работа со словарем нередко вызывает ошибки: попытка обратиться к значению через ключ, которого нет, приводит к исключению. Также часто путаются операции добавления, изменения и добавления новых значений.
Решение
Для доступа к значениям используют индексатор или методы TryGetValue, ContainsKey. Чтобы избежать исключения KeyNotFoundException, всегда делайте явную проверку:
Пример кода:
Dim dict As New Dictionary(Of String, Integer)() dict.Add("one", 1) dict("two") = 2 ' Добавление новой пары If dict.ContainsKey("three") Then Console.WriteLine(dict("three")) ' Не вызовет ошибку Else Console.WriteLine("Key not found") End If Dim value As Integer = 0 If dict.TryGetValue("one", value) Then Console.WriteLine(value) End If
Ключевые особенности:
Правда ли, что dict("ключ") всегда добавляет новую пару ключ-значение?
Нет. Если ключ существует, то значение обновляется. Если не существует — пара добавляется. Для добавления с ошибкой при наличии ключа — используйте Add.
Будет ли TryGetValue выбрасывать исключение, если ключа нет?
Нет. Он вернет False, не вызывая исключения, и не изменит value. Это безопасный способ доступа.
Можно ли хранить в Dictionary типы-значения (например, Integer) как TValue и при этом получать null для отсутствующего ключа?
Нет. Для типо-значения возвращается значение по умолчанию для типа (0 для Integer), но доступ через индексатор все равно вызнет исключение при отсутствии ключа.
Доступ к словарю по индексу без предварительной проверки дублируется в разных местах — периодические падения программы.
Плюсы:
Минусы:
Повсеместное применение TryGetValue, все обращения защищены, случаи отсутствия ключа логически обрабатываются.
Плюсы:
Минусы: