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

时间:2009-05-20 09:46:13

标签: .net exception

another SO question,我看到有几个人建议我一直使用TryGetValue。

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

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

4 个答案:

答案 0 :(得分:13)

不,你是完全正确的IMO。

没有必要这样做:

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

唯一的好处就是:

value = dict[key];

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

这就像使用as进行投射 - 当状态为“错误”时,异常是正确的结果,因此请使用提供该行为的表单。

答案 1 :(得分:2)

如果预计密钥丢失,使用TryGetValue通常会产生更干净,更高效的代码。如果预期密钥存在,那么直接索引访问通常会更好 - 异常表示存在错误。

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

答案 2 :(得分:1)

如果没有钥匙是例外,可以提出例外,imho。

答案 3 :(得分:0)

如果字典中不存在键的异常行为(这听起来像是这样),那么如果找不到键就让异常被引发并让异常传播到栈中,这很好。如果您想使用防御性编程练习,可以在访问字典键之前使用以下内容:

Debug.Assert(Dictionary.ContainsKey(Key));

如果您预计密钥可能不存在的情况,或者如果您希望在密钥不存在的情况下运行某些代码,则您只需要使用TryGetValue。