在另一个SO问题中,我看到有几个人建议我始终使用TryGetValue。虽然我总是在Contains?/Access模式上使用TryGetValue,但当我期望键始终在字典中时,我故意避免这种模式。然后我选择直接使用索引器访问,以便在键不存在时引发异常,因为发生了一些意外的情况(即我期望键在字典中而实际上不在)。由于似乎存在普遍共识反对我的“最佳实践”(我提到的帖子中的4个人中有3个明确建议始终使用TryGetValue),所以我渴望阅读关于这个主题的扩展讨论...
不,我认为你是完全正确的。
做以下事情没有意义:
if (dict.TryGetValue(key, out value))
{
// whatever
}
else
{
throw new SomeException("key '" + key + "' wasn't in dictionary");
}
相较于其他方式,唯一的好处是:
value = dict[key];
使用这种方式,可以获得更明确的异常信息... 但代价是可读性下降,我个人认为。
这就像强制类型转换和使用as
- 当状态“错误”时,异常是正确的结果,因此使用能够提供这种行为的形式。
如果预计键值不存在,使用TryGetValue
通常会产生更清晰和更高效的代码。如果预计键值存在,则直接索引访问通常更好 - 异常表示存在错误。
ContainsKey
通常仅在不需要相应值时使用。
Debug.Assert(Dictionary.ContainsKey(Key));
只有在你预期键可能不存在的情况下,或者如果你想要在键不存在的情况下运行某些代码时,才真正需要使用TryGetValue。