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

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

【问题讨论】:

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

标签: .net hashtable


【解决方案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】:

    不,它们的行为完全相同

    【讨论】:

      猜你喜欢
      • 2012-09-07
      • 2022-12-09
      • 1970-01-01
      • 1970-01-01
      • 2010-11-08
      • 2012-08-07
      • 2010-11-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多