Почему TryGetValue освобождает мой словарь?
У меня есть этот кусок кода:
Dictionary<string, object> tempDict = new Dictionary<string, object>();
if(xDicionary.TryGetValue(...., out tempDict)
{
tempDict.Add(...);
}
else
{
tempDict.Add(..);
}
Если код переходит к блоку else, я получаю исключение, которое не может выполнить добавление, поскольку tempDict указывает на ноль. Почему это происходит? Я знаю, как безобразно обойти это, выделяя новый словарь также в блоке else, но есть ли лучший способ сделать это?
5 ответов
Потому что методы, которые имеют out
параметр, должен присвоить значение out
параметр. Это означает, что когда вы звоните xDicionary.TryGetValue
tempDict
всегда перезаписывается, а когда ничего не найдено, устанавливается значение NULL. Поэтому в вашем другом, tempDict
всегда будет нулевым.
Вот как TryGetValue
работает, потому что он использует out
параметр. out
Параметру всегда присваивается значение в методе, поэтому независимо от того, к какому параметру вы инициализируете, он будет перезаписан.
Документация подтверждает это:
Этот параметр передается неинициализированным.
Таким образом, вы должны использовать временный.
TryGetValue
вернет false и установит tempDict
в null
если бы не смог получить значение.
Это происходит потому, что out
параметр должен быть определенно назначен в вызываемом методе, и когда значение не может быть повторено для типа значения, null
логическое значение по умолчанию для него.
Это нормальная семантика всех BCL TryGet*
методы.
Вы должны поместить tempDict = new ... в блок else {}. Если TryGetValue возвращает false, вы не можете полагаться на значение в параметре out.
Потому что, если xDictionary
не содержит запрашиваемое значение, TryGetValue
возвращается false
и out
значение установлено в null
, Следовательно, когда вы пытаетесь сделать Add
что-то null
ты получаешь NullReferenceException
,