在 .NET 中,如果您向字典询问与它没有的键关联的值,则会引发异常。您可以通过调用 TryGetValue
来解决这个问题。但我发现它使用 Ref var 是可恶的。
这意味着您通常必须首先检查 key 是否存在( ContainsKey
)来防止丢失 key ,这看起来很麻烦。
在 Ruby 中,如果您询问与键关联的值的哈希值,则不会出现异常。它只会返回一些默认值,您可以根据需要进行更改。这使得使用散列更加愉快。
.NET 词典是否有理由对缺少的键大惊小怪,使它们更有用?
最佳答案
问题在于,默认值根本不是关键字不在字典中的明确答案。例如在 .Net 中,类的默认值是 null
.对于任何 ref 类型,这是一个完全可以接受的值,因此可以用作键。
Dictionary<int, string> map = ...;
map.Add(42, null); // OK
让我们假设一秒钟
Dictionary<TKey, TValue>
当缺少键时确实返回了默认值。在那个世界中,以下代码将失败void FillValue(Dictionary<int, string> map, int value) {
if (map[value] == null) {
map.Add(value, "");
}
}
在
value
的情况下,此代码将失败已经存在于字典中,值为 null
.它会抛出因为 Add
要求该值不存在才能正确执行。最重要的是,使用默认值表示缺失的情况会在代码中产生不可避免的歧义。当前设计
Dictionary<TKey, TValue>
尽可能避免歧义还要注意
Hashtable
的设计正如您所建议的(缺失值返回 null
)。 .Net 放弃了这种设计,部分原因是它造成了歧义问题。
关于.net - 为什么 .NET 字典发牢骚?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20642460/