.Net Hashtable - Contains vs ContainsKey

Posted

技术标签:

【中文标题】.Net Hashtable - Contains vs ContainsKey【英文标题】: 【发布时间】:2011-02-05 04:05:37 【问题描述】:

我刚刚注意到 HashTable 对象有一个 Contains 和 CotainsKey 方法,具有相同的描述。那么它们只是同义词还是在幕后有一些差异

【问题讨论】:

好问题! Contains 是用来实现IDictionary.Contains 的,它“确定IDictionary 对象是否包含具有指定键的元素” - 那么为什么ContainsKey 在那里?! 嗯,值得深思。你为什么不为此打开一个单独的问题。 【参考方案1】:

如果用反射器查看 Contains 的代码,可以看到它直接调用了 ContainsKey。

IL 是:

.method public hidebysig newslot virtual instance bool Contains(object key) cil managed

    .maxstack 8
    L_0000: ldarg.0 
    L_0001: ldarg.1 
    L_0002: callvirt instance bool System.Collections.Hashtable::ContainsKey(object)
    L_0007: ret 

这转换为以下 C#

public virtual bool Contains(object key)

    return this.ContainsKey(key);

【讨论】:

那么为什么 ContainsKey 是公开的? 这个答案表明ContainsContainsKey 执行相同的功能,但它没有回答原因。 AakashM 暗示的最可能的答案是,Contains 函数的唯一目的是实现IDictionary 接口,以便哈希表可以与其他字典对象互换。 如果不查看有关Contains 方法的帮助或文档,就不清楚它是否执行与ContainsKeyContainsValue 相同的功能。更好的问题是,“为什么IDictionary 接口没有ContainsKey 方法?”因为ContainsKey 并不晦涩。 最有意义的答案是糟糕的设计。【参考方案2】:

Contains 方法只是在内部调用ContainsKey 方法 - 您可以使用Reflector 进行检查。

【讨论】:

【参考方案3】:

不,它们的行为完全相同

【讨论】:

以上是关于.Net Hashtable - Contains vs ContainsKey的主要内容,如果未能解决你的问题,请参考以下文章

HashMap和Hashtable的不同点

9月20号面试总结(shangyun)

HashMap与HashTable的区别

HashMap和Hashtable的区别

HashMap和Hashtable的区别。

java中HashMap和Hashtable的区别