为啥 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?