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