Будет ли когда-нибудь мой код попадать? ConcurrentDictionary TryGetValue(..)
Если у меня есть параллельный словарь, и я пробую TryGetValue, и я проверяю, если это не удается, я делаю вещи, но если это не терпит неудачу, и выходное значение, полученное из TryGetValuefunction, равно тому, что было до того, как я попробовал 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 ответа
Документация 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
В какой-то момент объект будет содержать данные, используя код, которого здесь нет.
Второй блок if будет всегда выполняться, если значение для предоставленного ключа отсутствует в ConcurrentDictionary.
Прочтите раздел "Параметры" для значения по этому URL.
TryGetValue
всегда будет возвращать false, потому что вы ничего не поместили в словарь. После того, как он вернет false, первый блок if не будет запущен, а второй блок if будет запущен, оба блока будут запущены, потому что outVal
будет иметь значение default(DateTime)
,
Однако, если в словаре есть какие-то данные, это возможно для default(DateTime)
быть значением, связанным с ключом, который вы передаете TryGetValue
, В этом случае первый блок if не будет работать, а второй - блок if.
РЕДАКТИРОВАТЬ:
Первоначальная версия первого абзаца выше неверна. Обратите внимание на отрицание (!
) в вашем заявлении if:
if (!m_unitsWaitingForReadResponse.TryGetValue("teststring", out outVal))
Это выражение оценивается как true
когда TryGetValue возвращает 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
выполняет.