В дополнение к выигрышам в производительности, CHAR
может использоваться, чтобы указать, что все значения должны быть той же длиной, например, столбец для Американских Государственных сокращений.
Производительность почти на 100% идентична. Вы можете проверить это, открыв класс в Reflector.net
Это индексатор This:
public TValue this[TKey key]
{
get
{
int index = this.FindEntry(key);
if (index >= 0)
{
return this.entries[index].value;
}
ThrowHelper.ThrowKeyNotFoundException();
return default(TValue);
}
set
{
this.Insert(key, value, false);
}
}
А это метод Add:
public void Add(TKey key, TValue value)
{
this.Insert(key, value, true);
}
Я не буду публиковать весь метод Insert, поскольку он довольно длинный, однако объявление метода следующее:
private void Insert(TKey key, TValue value, bool add)
И далее в функции происходит следующее:
if ((this.entries[i].hashCode == num) && this.comparer.Equals(this.entries[i].key, key))
{
if (add)
{
ThrowHelper.ThrowArgumentException(ExceptionResource.Argument_AddingDuplicate);
}
Которая проверяет, существует ли уже ключ, и если он существует и параметр add имеет значение true, генерируется исключение.
Итак для всех целей и намерений производительность одинакова.
Как и несколько других упоминаний, все дело в том, нужна ли вам проверка для попыток добавить один и тот же ключ дважды.
Извините за длинный пост, я надеюсь, что это хорошо.
Dictionary.Add (ключ, значение)
и Dictionary [key] = value
имеют разные цели:
Добавить
к добавить новую пару ключ / значение, существующие ключи не будут заменены (выдается ArgumentException
). Да, в этом разница, метод Add выдает исключение, если ключ уже существует.
Причина использования метода Add именно в этом. Если словарь уже не должен содержать ключ, обычно требуется исключение, чтобы вы знали о проблеме.
Учитывая наиболее вероятное сходство в производительности, используйте то, что кажется более правильным и читаемым для того фрагмента кода, который вы используете.
Я чувствую, что операция, описывающая добавление, является наличие ключа, которое уже является действительно редким исключением, лучше всего представлено с помощью add. Семантически это имеет больше смысла.
dict [key] = value
лучше представляет собой замену. Если я увижу этот код, я почти ожидаю, что ключ уже есть в словаре.
Первая версия добавит новую KeyValuePair в словарь, выбрасывая, если ключ уже есть в словаре. Второй, используя индексатор, добавит новую пару, если ключ не существует, но перезапишет значение ключа, если оно уже существует в словаре.
IDictionary<string, string> strings = new Dictionary<string, string>();
strings["foo"] = "bar"; //strings["foo"] == "bar"
strings["foo"] = string.Empty; //strings["foo"] == string.empty
strings.Add("foo", "bar"); //throws