首先,使用索引编号(例如myConcurrentDictionary[someKey] = someValue;
)简单地将项添加到并发字典是否安全?
我很困惑,因为它隐藏了IDictionary方法(例如Add
)。
为什么AddOrUpdate()需要func来更新值?是否有方法设置密钥的值,无论密钥是否已存在?
我无法从MSDN页面收集到这些内容。
答案 0 :(得分:20)
是的,如果您想添加或替换值,使用索引器应该绝对正常。
AddOrUpdate
接受一个委托,以便您可以将“旧”和“新”值合并在一起,以形成您希望在字典中的值。如果您不关心旧值,请改用索引器。
索引器 是“设置密钥值的方式,无论密钥是否已存在”,就像在任何其他IDictionary<,>
实现中一样。
documentation底部有一个整洁的部分 - 一种配方 - 包括:
要做到这一点......
无条件地将键/值对存储在字典中,并覆盖已存在的键的值使用此方法
索引器的setter:dictionary[key] = newValue
因此它被正式批准。
答案 1 :(得分:2)
索引器将找到由给定键表示的对,如果它不存在则添加它,并将该值替换为给定值(如果它存在)。从字典的角度来看,该操作在逻辑上是“原子的”。当多个线程同时通过其索引器访问字典时,您不必担心字典被损坏。
Add
被隐藏,因为您通常应该使用TryAdd
。如果在检查密钥是否存在后由另一个线程添加该密钥,则添加可能会失败。这当然不是索引器的问题。如果另一个线程在当前线程之前添加了该项,它只会覆盖该值,而不是抛出异常。
AddOrUpdated
为更新提供了一个函数,原因有两个: