如果我有ConcurrentDictionary实例,那么是否使用Count属性或LINQ的Any()无关紧要?我宁愿写dict.Any()而不是dict.Count > 0,因为我认为Any()更具描述性。

我只关注正确性,而不关注性能。用例是

void process()
{
   if (concurrentDictionary.Count <= 0) // or !Any() ?
      return; // dictionary is empty, nothing to do

   // ...
}

最佳答案

问题Are IEnumerable Linq methods thread-safe?解决了以下事实:如果不保持特定的锁来保护集合,则LINQ查询上的IEnumerable方法不是线程安全的。

您可以查看reference code for ConcurrentDictionary来查看该枚举器没有提供线程安全的快照。有关ConcurrentDictionary.GetEnumerator的其他MSDN文档指出:

从字典返回的枚举数可以安全地与对字典的读取和写入同时使用,但是它不代表字典的即时快照。通过枚举器公开的内容可能包含在调用GetEnumerator之后对字典所做的修改。

Count属性对字典具有完全锁定,并返回一致的结果。

因此,根据是否要锁定字典来运行Any(),检查Count > 0可能更干净。

关于.net - ConcurrentDictionary.Count> 0是否与ConcurrentDictionary.Any()相同?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29399256/

10-13 07:30