Будет ли когда-нибудь мой код попадать? 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.

Метод ConcurrentDictionary.TryGetValue

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 не применима в вашем случае:

  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 выполняет.

Другие вопросы по тегам