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