C# 如何在ConcurrentDictionary中设置值,而不管它是否包含键

C# 如何在ConcurrentDictionary中设置值,而不管它是否包含键,c#,concurrentdictionary,C#,Concurrentdictionary,首先,使用索引赋值(例如,myconcurrentdirectionary[someKey]=someValue;)简单地将一个项添加到并发字典中是否安全 我只是感到困惑,因为它隐藏了IDictionary方法(例如,Add) 为什么AddOrUpdate()需要func来更新值?是否有一种方法可以设置键的值,而不管该键是否已经存在 我真的无法从MSDN页面上收集到这些信息 是的,如果您想添加或替换值,使用索引器应该是绝对正确的 AddOrUpdate接受一个委托,以便您可以将“旧”和“新”值

首先,使用索引赋值(例如,
myconcurrentdirectionary[someKey]=someValue;
)简单地将一个项添加到并发字典中是否安全

我只是感到困惑,因为它隐藏了IDictionary方法(例如,
Add

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

我真的无法从MSDN页面上收集到这些信息

  • 是的,如果您想添加或替换值,使用索引器应该是绝对正确的

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

  • 索引器是一种“设置键的值,不管该键是否已经存在”的方法,就像在任何其他
    IDictionary
    实现中一样

  • 底部有一个整洁的部分-一种配方位-包括以下内容:

    要做到这一点…
    无条件地将密钥/值对存储在字典中,并覆盖已存在的密钥的值

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


    因此它是官方认可的。

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

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

    AddOrUpdated
    使用函数进行更新有两个原因:

  • 它可以使用以前的值来确定更新后的值
  • 生成更新的值可能会产生副作用,或者是一个昂贵的计算。将其设置为一个函数允许延迟此操作,直到您知道您确实需要更新某个项目

  • 你所说的“安全”到底是什么意思?对于我自己来说,如果两个线程同时尝试添加/更新一个条目,只要没有异常,就安全了。但是,实际上我提到了“安全”,因为我不理解Add()方法隐藏的原因。所以我假设Add()或[]不应该被使用。那么您假设这两个成员都不应该被使用,因为其中只有一个被显式实现?我不明白其中的逻辑。如果你不打算使用索引器,那么它也会被显式地实现。是的,我知道,只是觉得这样更安全。