【问题标题】:Is IDictionary[index] is misused?IDictionary[index] 是否被滥用?
【发布时间】:2011-02-21 15:47:22
【问题描述】:

在我的 C# 编码经验中,我看到了很多使用 IDictionary[index] setter 添加新值的代码:

var dictionary = new Dictonary<long, string>();
...
dictionary[1] = "one"; //assume we want to add new value here

因此,开发人员通过索引器调用(等于 AddOrUpdate 操作)重写旧值(如果存在),而不是使用 dictionary.Add(1, "one");

我认为当您尝试将值设置为已经存在的键时,字典应该抛出异常(就像您尝试获取不存在的键时抛出的异常一样)。这是一个有争议的陈述,但我想将我的观点与你的观点进行比较。

【问题讨论】:

  • 这似乎是一个完全主观的问题,没有实际的理性依据。 90% 的情况下,当您想将某些东西放入地图时,您需要AddOrUpdate,所以我完全赞成使用最简单的语法来表示该操作。附: Dictionary 抛出异常很糟糕。正确的 API 是将结果作为 (value exists?, value) 的元组返回,但 C# 让这很痛苦。

标签: c# .net


【解决方案1】:

让两个成员做同样的事情有什么意义?

如果您想有效地将​​字典用作关联数组,并以与数组相同的方式进行分配,请使用索引器。如果您想在字典中添加更“谨慎”的内容,请使用 Add

使索引器抛出现有条目会使其行为与其他集合(例如数组和列表)的索引器完全不同。

(编辑:请注意,字典索引器的行为当然已经略有不同,当您尝试 fetch 一个没有被赋予值的条目时抛出异常。在某些方面,这是与访问超出范围的索引相同,我想...)

【讨论】:

    【解决方案2】:

    这绝对是一个见仁见智的问题,我个人更喜欢现有的行为。没有什么能阻止您创建实现 IDictionary&lt;TKey,TValue&gt; 并提供您正在寻找的行为的自定义类型。

    【讨论】:

      【解决方案3】:

      为什么会这样?至于我,这是正常的行为。 你想如何更新字典中的值?据我了解,开发人员应该删除这个键值对,而不是只在字典中添加新的键值对,不是吗?

      【讨论】:

        猜你喜欢
        • 2014-04-16
        • 2014-07-14
        • 2011-06-06
        • 1970-01-01
        • 2020-10-18
        • 2013-11-22
        • 2011-05-11
        • 2010-10-19
        相关资源
        最近更新 更多