c# - 为什么字典不像哈希表那样访问不存在的键?

标签 c# .net dictionary hashtable

如果我使用 Hashtable ,我可以这样写代码:

object item = hashtable[key] ?? default_value;

不管key 是否有效。出现在 Hashtable .

我不能用 Dictionary<TKey. TValue> 做到这一点.如果键不在字典中,将抛出 KeyNotFoundException。 .所以我必须这样写代码:

MyClass item;
if (!(dict.TryGetValue(key, out item))
{
   item = default_value;
}

我想知道这是为什么。 Dictionary<TKey, TValue>只是 Hashtable 的包装.为什么要添加此限制?

编辑:

从另一个角度看 PopCatalin 的回答(见下文),如果字典的值是值类型,我上面写的代码将不起作用。如果我使用 Dictionary<int, int> ,那么我喜欢使用的代码如下所示:

int i = dict[key] ?? default_value;

那不会编译,因为 dict[key]不是可空类型或引用类型。

最佳答案

Dictionary<T>之间的区别和一个 Hashtable那是Dictionary<T>吗是一种通用类型,可以专门用于存储值类型和引用类型。

哈希表只能存储引用类型(通过引用传递的 Object)和装箱的值类型(也通过引用传递)。

当字典专用于值类型时,它必须“按值”而不是按引用返回这些值。因此,Dictionary<T>不能返回 null,因为 null 不是值类型的有效值

关于c# - 为什么字典不像哈希表那样访问不存在的键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/399270/

相关文章:

c# - 覆盖 SharePoint :SaveButton in custom form template

c# - 使用 C# 循环移位 Int32 位

c# - Parallel.ForEach 中长时间运行进程的进度条

Python折叠/减少多个词典的组成

python - 获取字典中字典中的值

c# - 无法更改关系,因为一个或多个外键属性不可为空

c# - 使用谓词列表时出现 DataContract SerializationException

c# - 在 .NET Core 2.1 中使用通用主机正常关闭

.net - 在.NET CF上播放PCM音频流

jquery - jQuery 对话框中的 Bing map 仅在 IE8/9 中无法正确显示