В документации указано, что bool Dictionary<TKey, TValue>.ContainsKey(TKey key)
генерирует исключение в случае передачи пустого ключа. Может ли кто-нибудь объяснить причину этого? Не было бы более практичным, если бы он только что вернулся false
?
Почему Dictionary.ContainsKey вызывает ArgumentNullException?
Ответ 1
Если ContainsKey(null)
возвращено false
, это даст ложное впечатление, что пустые ключи разрешены.
Ответ 2
Вот как это реализовано: (Источник)
public bool ContainsKey(TKey key) {
return FindEntry(key) >= 0;
}
И метод FindEntry
как:
private int FindEntry(TKey key) {
if( key == null) {
ThrowHelper.ThrowArgumentNullException(ExceptionArgument.key);
}
if (buckets != null) {
int hashCode = comparer.GetHashCode(key) & 0x7FFFFFFF;
for (int i = buckets[hashCode % buckets.Length]; i >= 0; i = entries[i].next) {
if (entries[i].hashCode == hashCode && comparer.Equals(entries[i].key, key)) return i;
}
}
return -1;
}
Поскольку значение null
в качестве ключа в словаре не разрешено.
Dictionary<string, int> dictionary = new Dictionary<string, int>();
dictionary.Add(null, 10);
Вышеизложенное создаст исключение:
Значение не может быть нулевым. Имя параметра: клавиша
По вашему вопросу:
Не было бы более практичным, если бы он просто вернул false?
Кто-то из Microsoft, вероятно, ответит на это. Но IMO, так как добавление значения null
для ключа не допускается, нет смысла проверять ключ null
в ContainsKey