在another SO question,我看到有几个人建议我一直使用TryGetValue。
虽然我总是在Contains?/ Access模式上使用TryGetValue,但是当我希望密钥始终在字典中时,我会故意避免使用此模式。然后我去寻找一个直接的索引器,这样如果没有键就会引发异常,因为出现了意想不到的事情(比如我期望键不在字典中)。
由于似乎对我的“最佳实践”达成了普遍共识(我提到明确建议在任何时候使用TryGetValue的帖子中有4人中有3人),我渴望阅读有关该内容的扩展讨论主题...
答案 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。