为什么TryGetValue释放我的字典



我有这段代码:

Dictionary<string, object> tempDict = new Dictionary<string, object>();
if(xDicionary.TryGetValue(...., out tempDict)
{
tempDict.Add(...);
}
else
{
tempDict.Add(..);
}

如果代码传递到else块,那么我得到一个不能执行add的异常,因为tempDict指向null。为什么会发生这种情况?我知道如何通过在else块中分配new Dictionary来绕过它,这是一种丑陋的方式,但有更好的方法吗?

因为有out参数的方法,必须out参数赋值。这意味着当您调用xDicionary.TryGetValue时,tempDict总是被覆盖,当没有找到时,它被设置为null。因此,在else中,tempDict始终为null。

这就是TryGetValue的工作原理,因为它使用了out参数。out参数总是在方法中赋值,所以无论你初始化参数为什么,它都会被覆盖。

文档说明了这一点:

该参数未初始化传递。

所以你必须使用临时的。

TryGetValue将返回false,如果无法获取该值,则将tempDict设置为null

这是因为out参数必须在被调用的方法中明确地赋值,当值不能为值类型重试时,null逻辑默认值分配给它。

这是所有BCL TryGet*方法的正常语义

因为如果xDictionary不包含请求的值,则TryGetValue返回false,并将out的值设置为null。因此,当您尝试对null执行Add时,您会得到NullReferenceException

你应该把tempDict = new…在else{}块中。如果TryGetValue返回false,则不能依赖out参数中的值。

最新更新