.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 是公开的? 这个答案表明Contains
和ContainsKey
执行相同的功能,但它没有回答原因。 AakashM 暗示的最可能的答案是,Contains
函数的唯一目的是实现IDictionary
接口,以便哈希表可以与其他字典对象互换。
如果不查看有关Contains
方法的帮助或文档,就不清楚它是否执行与ContainsKey
或ContainsValue
相同的功能。更好的问题是,“为什么IDictionary
接口没有ContainsKey
方法?”因为ContainsKey
并不晦涩。
最有意义的答案是糟糕的设计。【参考方案2】:
Contains
方法只是在内部调用ContainsKey
方法 - 您可以使用Reflector 进行检查。
【讨论】:
【参考方案3】:不,它们的行为完全相同
【讨论】:
以上是关于.Net Hashtable - Contains vs ContainsKey的主要内容,如果未能解决你的问题,请参考以下文章