c# Hashtable Add vs Indexer -为什么两者都有?

本文关键字:为什么 两者都 Indexer Hashtable Add vs | 更新日期: 2023-09-27 17:52:46

我知道哈希表的添加和通过索引器赋值操作是不同的(即后者将允许覆盖,而前者抛出"项已被添加"。在字典中键入:…"例外)。我的问题是,在什么情况下,您想添加一些东西,但如果它已经存在,就会抛出异常?

具体来说,这似乎只是封装了两个原子操作(Contains和通过索引器赋值),我想不出一个场景,我希望微软以一种封装的方式来处理它。

EDIT:我完全支持异常情况应该抛出异常的想法,并且当给定的键已经在字典中时,Add(虽然只是一个封装)提供异常。然而,哈希表和字典通常用于从键到值的快速查找。此外,大多数时候,当我构建一个字典时,我已经有了整个集合,我只是把它翻译成字典。

一个例子正好击中了我…我可以想象这样一个场景:您使用散列表(或字典)来跟踪登录到特定会话的用户的会话。如果您有一个特定的需求,即每个用户一次只能从一个位置登录(并且在再次登录之前必须退出一个会话),那么您可能需要添加,因为它更清楚地定义了代码的意图。

c# Hashtable Add vs Indexer -为什么两者都有?

需要异常抛出行为的场景是,您永远不期望该值在那里,因此发现它就会出现异常,表明出了问题。如果您不希望键已经存在,那么您不会想要为每个添加的元素执行包含测试,对吧?

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

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