18

首先,使用索引分配(例如myConcurrentDictionary[someKey] = someValue;)简单地将项目添加到并发字典中是否安全?

我只是很困惑,因为它隐藏了 IDictionary 方法(例如Add)。

为什么 AddOrUpdate() 需要一个函数来更新值?不管键是否已经存在,是否有一种方法可以设置键的值?

我无法真正从 MSDN 页面收集到这个。

4

2 回答 2

41
  1. 是的,如果你想添加或替换一个值,使用索引器应该是绝对没问题的。

  2. AddOrUpdate接受一个委托,以便您可以将“旧”和“新”值合并在一起以形成您希望在字典中出现的值。如果您不关心旧值,请改用索引器。

  3. 就像在任何其他实现中一样,索引器“为键设置值而不管键是否已经存在”的方法。IDictionary<,>

文档的底部有一个简洁的部分 - 一种配方位 - 包括:

为此...
无条件地将键/值对存储在字典中,并覆盖已存在的键的值

使用此方法
索引器的设置器:dictionary[key] = newValue

所以它得到了官方的认可。

于 2014-02-05T18:03:14.097 回答
2

索引器将找到由给定键表示的对,如果不存在则添加它,如果存在则用给定值替换该值。从字典的角度来看,这个操作在逻辑上是“原子的”。当多个线程通过其索引器同时访问字典时,您无需担心字典被损坏。

Add是隐藏的,因为您通常应该使用它TryAdd。如果在检查密钥是否存在后由另一个线程添加该密钥,则添加可能会失败。这当然不是索引器的问题。如果另一个线程在当前线程之前添加了该项目,它只会覆盖该值,而不是抛出异常。

AddOrUpdated更新函数有两个原因:

  1. 它可以使用先前的值来确定更新的值。
  2. 生成更新的值可能会产生副作用,或者是昂贵的计算。使它成为一个函数允许这个操作被推迟,直到你知道你确实需要更新一个项目。
于 2014-02-05T18:04:56.367 回答