我应该总是使用TryGetValue来访问.net字典吗?

9
另一个SO问题中,我看到有几个人建议我始终使用TryGetValue。虽然我总是在Contains?/Access模式上使用TryGetValue,但当我期望键始终在字典中时,我故意避免这种模式。然后我选择直接使用索引器访问,以便在键不存在时引发异常,因为发生了一些意外的情况(即我期望键在字典中而实际上不在)。由于似乎存在普遍共识反对我的“最佳实践”(我提到的帖子中的4个人中有3个明确建议始终使用TryGetValue),所以我渴望阅读关于这个主题的扩展讨论...
4个回答

13

不,我认为你是完全正确的。

做以下事情没有意义:

if (dict.TryGetValue(key, out value))
{
    // whatever
}
else
{
    throw new SomeException("key '" + key + "' wasn't in dictionary");
}

相较于其他方式,唯一的好处是:

value = dict[key];

使用这种方式,可以获得更明确的异常信息... 但代价是可读性下降,我个人认为。

这就像强制类型转换和使用as - 当状态“错误”时,异常是正确的结果,因此使用能够提供这种行为的形式。


2
如果你使用TryGetValue/throw,你可以将实际的键添加到异常消息中,这是默认的KeyNotFoundException无法做到的(除非我漏掉了什么)。 - Skizz

2

如果预计键值不存在,使用TryGetValue通常会产生更清晰和更高效的代码。如果预计键值存在,则直接索引访问通常更好 - 异常表示存在错误。

ContainsKey通常仅在不需要相应值时使用。


1
如果缺少关键字是异常情况,我认为引发异常是可以的。

0
如果在您的字典中找不到键是异常行为(这就是听起来的样子),那么如果未找到键,则让异常被引发并让该异常向下传播是可以的。如果您想使用防御性编程实践,您可以在访问字典键之前使用以下方法:
Debug.Assert(Dictionary.ContainsKey(Key));

只有在你预期键可能不存在的情况下,或者如果你想要在键不存在的情况下运行某些代码时,才真正需要使用TryGetValue。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接