Ответ 1
"Используйте ConcurrentDictionary, если вы много используете словарь в коде" - это нечеткий совет. Я не обвиняю вас в замешательстве.
ConcurrentDictionary
является основным для использования в среде, где вы обновляете словарь из нескольких потоков (или асинхронных задач). Вы можете использовать стандартный Dictionary
из такого количества кода, сколько хотите, если он из одного потока;)
Если вы посмотрите на методы в ConcurrentDictionary, вы увидите некоторые интересные методы, такие как TryAdd
, TryGetValue
, TryUpdate
и TryRemove
.
Например, рассмотрим типичный шаблон, который вы можете увидеть для работы с обычным классом Dictionary
.
// There are better ways to do this... but we need an example ;)
if (!dictionary.ContainsKey(id))
dictionary.Add(id, value);
У этого есть проблема в том, что между проверкой того, содержит ли он ключ и вызывает ли Add
другой поток, можно вызвать Add
с тем же id
. Когда этот поток вызывает Add
, он выдает исключение. Метод TryAdd
обрабатывает это для вас и вернет true/false, сообщив вам, добавило ли он его (или этот ключ уже был в словаре).
Поэтому, если вы не работаете в многопоточном разделе кода, вы, вероятно, можете просто использовать стандартный класс Dictionary
. При этом теоретически у вас могут быть блокировки для предотвращения параллельного доступа к словарю; этот вопрос уже указан в разделе "Блокировка словаря против ConcurrentDictionary".