如果我有一个并发字典,我尝试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
}
答案 0 :(得分:2)
如果提供的键的值不在ConcurrentDictionary中,则第二个if块将始终执行。
阅读参数部分,了解此网址的值
答案 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不适用于您的情况:
default(DateTime)
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
执行。
答案 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
对象将在某个时刻包含数据,使用此处未见的代码。