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

Bra*_*ann 9 .net exception

另一个SO问题中,我看到有几个人建议我总是使用TryGetValue.

虽然我总是在Contains?/ Access模式上使用TryGetValue,但是当我希望密钥始终在字典中时,我会故意避免使用此模式.然后我去寻找直接的索引器,这样如果没有键就会引发异常,因为真正意外发生了一些事情(即在我期望的时候键不在字典中).

由于似乎已经对我的"最佳实践"达成了普遍共识(我提到明确建议在任何时候使用TryGetValue的帖子中有4人中有3人),我渴望阅读有关该主题的扩展讨论. .

Jon*_*eet 13

不,你是完全正确的IMO.

这样做没有意义:

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

唯一的好处是:

value = dict[key];
Run Code Online (Sandbox Code Playgroud)

是你得到一个更明确的异常消息......但以可读性为代价,IMO.

这就像施法与使用as- 当状态是"错误"时,例外是正确的结果,所以使用给出该行为的形式.

  • 如果执行TryGetValue/throw,则可以将实际键添加到异常消息中,这是默认KeyNotFoundException无法执行的操作(除非我遗漏了某些内容). (2认同)