我可以通过两种方式为当前项目中并发字典中的现有键分配值。
A.
concurrentDictionary1[key] = value
;
和
B.
concurrentDictionary2.AddOrUpdate(key, value, (k, v) => value);
如果我知道“密钥”存在,这些功能在功能上是等价的吗?
方法“A”绕过了并发字典的并发性提供的保护吗?
这里有什么区别?选择其中之一而不是其他的原因是什么?
我查看了msdn的文档,似乎他们只用方法“A”初始化并发字典,而不是更新它。
这是一个老问题,但没有人回答为什么你会使用其中一个而不是另一个。
如果要添加或更新并且更新不依赖于现有值,请选择 A(索引器)。
如果要添加或更新并且更新取决于现有值,请选择 B(添加或更新)。 AddOrUpdate 将自动执行更新。
因此,在问题中的情况下,您想使用索引器。它更简单、更容易阅读,而且可能更快,因为您没有创建匿名函数。
他们都叫
TryAddInternal
,所以行为完全一样。
更新:
还有一个区别。 这是索引器中的代码:
set
{
TValue tValue;
if (key == null)
{
throw new ArgumentNullException("key");
}
this.TryAddInternal(key, value, true, true, out tValue);
}
对比从方法
while (!this.TryAddInternal(key, tValue, false, true, out tValue1));
因此,索引器有可能会默默地失败,而该方法将继续尝试直到成功。 嗯,需要更深入的分析才能充分理解两者之间的差异:/
反编译器仍然是你的朋友。
如果我知道“密钥”存在,这些功能在功能上是等价的吗?
你使用它的方式,是的。 事实上,无论
key
存在与否,它们都是等价的。
选择其中一种而不是另一种的原因是什么?
AddOrUpdate
接受用于更新值的 function。 您只是使用它直接设置值,但它设计用于根据函数的结果以并发方式更新值。 例如:
concurrentDictionary2.AddOrUpdate(key, value, (k, v) => v + value); // adds value to the existing value
是的,相当于。 不。索引器实际上是方法(就像属性一样),我认为它们不会为此绕过并发性。 方法