【问题标题】:Why does Dictionary[index] throws a KeyNotFoundException but Hashtable[index] doesn't?为什么 Dictionary[index] 会抛出 KeyNotFoundException 而 Hashtable[index] 不会?
【发布时间】:2010-12-14 19:38:47
【问题描述】:

知道为什么这种行为不同吗?

【问题讨论】:

  • 想知道同样的X-)

标签: c# .net dictionary hashtable


【解决方案1】:

因此,dictionary[key] 的值何时存储空值和该键不存在之间不会有歧义。如果 Hashtable[key] 存储 null 或 key 不存在,它将返回 null。

【讨论】:

    【解决方案2】:

    这是answer

    主要原因字典 抛出的是没有“错误” 适用于任何 V 的值。 Hashtable 能够返回 null 因为关键始终是参考 输入。

    【讨论】:

    • 值得注意的是:HashTable 允许以这种方式编写不安全的代码。 var ht = new Hashtable() {{"A", null}}; string aVal = (string)ht["A"]; string bVal = (string)ht["B"]; 两者都返回null,您无法区分有效值或不存在的键。至少这个 bug 是隐藏和无声的,更糟糕​​的是,字典会告诉你一个例外。
    【解决方案3】:

    Dictionary 抛出的主要原因是政治性的 - 有几个选项可以保持效率和易用性。它实际上提供了一种方法 (TryGetValue),该方法清楚地表明所谓“无法”返回合理值的说法是错误的。但是,TryGetValue 强制使用非常笨拙的语法来完成索引器可以轻松完成的工作。

    C# 模板为构建引用和值语义的单独实现提供了简单的方法,并且还有另外两个工具可以无缝处理具有值语义的缺失对象,这些对象被模板和一些运算符(默认和可为空)使用。这意味着没有合理的理由破坏哈希表的语义。

    这是一个长期的政治斗争,学术概念坚持每个人都必须通过“你有吗”检查和现实生活中的事实,即这种人为的程序效率低下并且破坏线程安全 - 原则上(它通过使访问非原子来破坏其他安全实现的线程安全性)。

    【讨论】:

    • 我希望TryXX 模式指定该方法在失败的情况下应返回default(T),但使用out bool 参数来指示它是否有效。这将允许book ok; var theValue = myDict.TryGetValue(myKey, out ok); if (ok) ...。这样的模式将允许类型推断和协方差,并且还有助于不存在的键的期望行为是假定值default(T) 的情况。
    猜你喜欢
    • 1970-01-01
    • 2010-10-28
    • 1970-01-01
    • 2013-02-18
    • 2014-06-22
    • 2023-02-04
    • 2023-03-27
    相关资源
    最近更新 更多