C# 为什么Dictionary[index]抛出KeyNotFoundException,而Hashtable[index]没有';T

C# 为什么Dictionary[index]抛出KeyNotFoundException,而Hashtable[index]没有';T,c#,.net,dictionary,hashtable,C#,.net,Dictionary,Hashtable,知道这种行为为何不同吗?因此,dictionary[key]的值何时存储空值和键何时不存在之间不会有歧义。如果哈希表[key]存储null或该键不存在,则它将返回null 这是答案 主要原因词典 关键是没有“错误” 在任何V上工作的值。 哈希表能够返回null 因为密钥始终是一个引用 类型 字典抛出的主要原因是政治性的——我们有几个选项来保持效率和易用性。它实际上提供了一种方法(TryGetValue),它清楚地证明了所谓“无法”返回合理值的说法是错误的。然而,TryGetValue强制使用非常

知道这种行为为何不同吗?

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

这是答案


主要原因词典 关键是没有“错误” 在任何V上工作的值。 哈希表能够返回null 因为密钥始终是一个引用 类型


字典抛出的主要原因是政治性的——我们有几个选项来保持效率和易用性。它实际上提供了一种方法(TryGetValue),它清楚地证明了所谓“无法”返回合理值的说法是错误的。然而,TryGetValue强制使用非常笨拙的语法来完成indexer可以轻松完成的事情

C#模板提供了为引用语义和值语义构建单独实现的简单方法,还有两种其他工具用于无缝处理带有值语义的缺失对象,tempates和一些操作符(默认和可空)使用了这两种工具。这意味着没有合理的理由破坏哈希表的语义


这是一场长期的政治斗争,学术上的集合概念坚持认为每个人都必须通过“do you have It”检查,而现实生活中的事实是这样的人工过程效率低下,破坏了线程安全——原则上(它通过使访问非原子化破坏了其他安全实现的线程安全).

想知道相同的X-)我希望
TryXX
模式指定方法在失败时应返回
default(T)
,但使用
out bool
参数指示其是否工作。这将允许
book ok;var theValue=myDict.TryGetValue(myKey,out ok);如果(正常)…
。这样的模式将允许类型推断和协方差,并且也有助于不存在的键的期望行为假定值为
default(T)
。值得注意的是:
HashTable
允许以这种方式编写未传递的代码
var ht=newhashtable(){{“A”,null};字符串aVal=(字符串)ht[“A”];字符串bVal=(字符串)ht[“B”]
都返回
null
,您无法区分有效值和不存在的键。至少这个bug是隐藏的和无声的,更糟糕的是,字典会告诉你一个例外。