C#Hashtable添加与索引器 - 为什么两者兼而有之?

时间:2011-04-25 20:21:48

标签: c# hashtable

我知道散列表的Add和assignment-via-indexer操作是不同的(即后者将允许覆盖,而前者抛出“已经添加了Item。字典中的键:...”异常) 。我的问题是你可能会想要添加一些东西的情况,但如果它已经存在则抛出异常?

具体来说,似乎这只是两个原子操作(Contains和assign-via-indexer)的封装,我无法想出一个单一的场景,我希望Microsoft以封装的方式处理它

编辑:我完全支持异常情况应抛出异常的想法,并且当给定键已经在字典中时,Add(简单地说是封装)提供异常。但是,通常使用Hashtables和Dictionaries来快速查找键到值。另外,大部分时间我正在构建一个,我已经有了整个集合,我只是将它翻译成字典。

一个例子就是打我...我可以想象你正在使用哈希表(或词典)跟踪登录到特定会话的用户会话的场景。如果您有一个特定的要求,即每个用户一次只能从一个位置登录(并且他们必须在再次登录之前退出一个会话),那么您可能需要添加,因为它更清楚地定义了代码。

2 个答案:

答案 0 :(得分:3)

需要抛出异常行为的场景是你不希望值存在的地方,所以在那里找到它会有一个例外,表明出现了问题。如果您从未期望密钥已存在,那么您不希望必须为每个添加的元素执行包含测试,对吧?

答案 1 :(得分:1)

可能是应用程序逻辑的一部分,您添加的对象不应该已存在。如果对象已经存在,则可能在其他地方的代码中提交了编程错误。像这样的案例通常被标记为例外或断言。拥有一个为您引发异常的方法可以避免您必须编写如下代码:

if 'key' in my_dict:
    raise ProgrammingErrorElsewhere()
my_dict['key'] = obj