17

文档指出,bool Dictionary<TKey, TValue>.ContainsKey(TKey key)如果传递了空键,则会引发异常。谁能给出一个理由?直接退货不是更实用false吗?

4

2 回答 2

22

如果ContainsKey(null)返回false,它会给人一种误导性的印象,即允许使用空键。

于 2013-12-06T15:48:33.607 回答
6

这是它的实现方式:(来源)

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);

上面会产生一个异常:

值不能为空。参数名称:key

对于您的问题:

如果它只是返回false,那不是更实用吗?

微软的某个人可能会回答这个问题。但是 IMO,由于不允许为 key 添加值,因此检查key innull是没有意义的nullContainsKey

于 2013-12-06T15:54:37.293 回答