0

如果我有一个并发字典,并且我尝试 TryGetValue,并且我测试它是否失败,我会做一些事情,但如果它没有失败,并且从 TryGetValue 函数检索到的值等于我尝试 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
}
4

3 回答 3

2

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

阅读此 URL 的值的参数部分

ConcurrentDictionary.TryGetValue 方法

于 2012-11-27T19:08:59.130 回答
1

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

TryGetValue您可以通过简单地在 first 上使用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对象将使用此处未显示的代码在某些时候包含数据。

于 2012-11-27T21:12:02.840 回答
1

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

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

编辑:

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

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

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

  1. 字典中不存在密钥
  2. 与字典中的键关联的值不等于default(DateTime)
  3. 与字典中的键关联的值等于default(DateTime)

在第一种情况下,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执行。

于 2012-11-27T19:07:46.903 回答