.net - 为什么 .NET 字典发牢骚?

标签 .net vb.net dictionary

在 .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/

相关文章:

vb.net - 如何保留 RichTextBox 中的文本格式,如粗体、斜体、字体颜色、字体大小等?

merge - 如何修改/合并 Jinja2 词典?

.net - 在 JSON.NET 中编码变音

c# - 如何使用图形服务客户端根据azure Active Directory中的组ID获取组名称

c# - 如何防止以下 C# 代码中的死锁?

java - Java 程序为 VB 应用程序生成的文件的编码问题

c# - 打印从 String 转换而来的 Char Array() 的问题

ASP.Net 网页堆叠 xml 文档而不是并排显示,CSS 问题?

Groovy 映射语法错误

ios - Hybrid MapKit map 默认引脚点击