为啥 Dictionary[index] 会抛出 KeyNotFoundException 而 Hashtable[index] 不会?

Posted

技术标签:

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

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

【问题讨论】:

想知道同样的X-) 【参考方案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) 的情况。

以上是关于为啥 Dictionary[index] 会抛出 KeyNotFoundException 而 Hashtable[index] 不会?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 FileOutputStream 会抛出 FileNotFoundException?

为啥“prepareCall”会抛出 NumberFormatException?

为啥 BluetoothSetLocalServiceInfo 会抛出错误 1314?

为啥geoip会抛出异常?

为啥这个 OdbcConnection 会抛出 System.InvalidOperationException?

为啥 jsonwebtoken 会抛出“无效签名”错误?