我的代码会被击中吗? ConcurrentDictionary TryGetValue(..)

时间:2012-11-27 19:04:09

标签: c# .net concurrency concurrentdictionary trygetvalue

如果我有一个并发字典,我尝试TryGetValue,我测试如果失败我做的东西,但如果它没有失败,并从TryGetValuefunction检索的out值等于之前的是尝试了TryGetValue,我做了别的事情。

我的问题是,(假设我的ConcurrentDicationary中的任何内容都不会被设置为默认值(DateTime)),我的第二个if语句是否会实际执行?或者目前的情况是不可能的?

var m_unitsWaitingForReadResponse = new ConcurrentDictionary<string, DateTime>();
DateTime outVal = default(DateTime);
if (!m_unitsWaitingForReadResponse.TryGetValue("teststring", out outVal))
{
    //Do Stuff
}
if (outVal == default(DateTime))
{
    //Do Stuff 2
}

3 个答案:

答案 0 :(得分:2)

如果提供的键的值不在ConcurrentDictionary中,则第二个if块将始终执行。

阅读参数部分,了解此网址的值

ConcurrentDictionary.TryGetValue Method

答案 1 :(得分:1)

TryGetValue将始终返回false,因为您没有在字典中添加任何内容。返回false后,第一个if块将不会运行,但第二个if块将运行,两个块都将运行,因为outVal的值为default(DateTime)

但是,如果字典中包含一些数据,则default(DateTime)可能是与您传递给TryGetValue的密钥相关联的值。在这种情况下,第一个if块将不会运行,但第二个if块将运行。

编辑:

上面第一段的原始版本不正确。注意if语句中的否定(!):

if (!m_unitsWaitingForReadResponse.TryGetValue("teststring", out outVal))

当TryGetValue返回true时,该表达式的计算结果为false。因此,您有以下可能性,但根据您的假设,可能性3不适用于您的情况:

  1. 字典中没有该键
  2. 与词典中的键相关联的值不等于default(DateTime)
  3. 与词典中的键相关联的值等于default(DateTime)
  4. 在第一种情况下,TryGetValue返回false; Do Stuff执行; outVal等于default(DateTime);并Do Stuff 2执行。

    在第二种情况下,TryGetValue返回true; Do Stuff没有执行; outVal不等于default(DateTime);并且Do Stuff 2没有执行。

    在第三种(不可能的)情况下,TryGetValue返回true; Do Stuff没有执行; outVal等于default(DateTime);并Do Stuff 2执行。

答案 2 :(得分:1)

MSDN文档指出,如果字典中不存在密钥,TryGetValue将返回default(TValue)。是的,它应该执行。

您可以通过在第一个TryGetValue上使用else子句来测试if的返回值,如下所示:

m_unitsWaitingForReadResponse= new ConcurrentDictionary<string, DateTime>();

DateTime outVal = default(DateTime);

if (!(m_unitsWaitingForReadResponse.TryGetValue("teststring", out outVal)))
{
    //Do Stuff
}
else
{
    //Do Stuff 2
}

我假设您的ConcurrentDictionary对象将在某个时刻包含数据,使用此处未见的代码。