【问题标题】:invalid key in Dictionary字典中的无效键
【发布时间】:2010-12-17 06:55:27
【问题描述】:

当使用无效键索引集合时,为什么字典不只返回 null

【问题讨论】:

    标签: c# collections


    【解决方案1】:

    微软决定 =)
    进行内联检查以避免这种情况。

    object myvalue = dict.ContainsKey(mykey) ? dict[mykey] : null;
    

    【讨论】:

      【解决方案2】:

      因为泛型字典可能包含值类型的实例,而 null 对于值类型无效。例如:

      var dict = new Dictionary<string, DateTime>();
      DateTime date = dict["foo"]; // What should happen here?  date cannot be null!
      

      您应该改用字典的 TryGetValue 方法:

      var dict = new Dictionary<string, DateTime>();
      DateTime date;
      
      if (dict.TryGetValue("foo", out date)) {
          // Key was present; date is set to the value in the dictionary.
      } else {
          // Key was not present; date is set to its default value.
      }
      

      此外,存储引用类型的字典仍将存储空值。您的代码可能会认为“值为空”与“键不存在”不同。

      【讨论】:

      • 这并没有真正解决设计决策的原因;他们本可以轻松地让它返回 default(DateTime) 而不是 null。
      • @Extragorey 是的,特别是最后一句话:无论“未找到”值是什么,您可能需要将该值存储为有意义的值。如果获取未找到的键返回default(DateTime),那么您无法区分“值是default(DateTime)”和“键不存在”,至少无需额外调用ContainsKey()(这将不必要地手术成本翻倍)。对于包含引用类型作为值的字典,除了“键不存在”之外,null 可能是一个有意义的状态。
      • 谢谢,这个解释更有意义。
      【解决方案3】:

      实际原因:因为字典可以存储空值。在您的场景中,您将无法区分这种情况,但有例外。

      【讨论】:

        【解决方案4】:
        【解决方案5】:
        猜你喜欢
        • 1970-01-01
        • 2019-01-17
        • 2010-12-03
        • 2015-03-24
        • 1970-01-01
        • 1970-01-01
        • 2015-01-19
        • 2019-02-20
        相关资源
        最近更新 更多