1

我有一个字典,它将字符串映射到这样的对象: Dictionary<string, object> myDic;

我事先知道对象的类型是基于字符串的,但我的问题是我应该使用 TryGetValue,还是使用 try、catch 语句直接查找。

例子:

//TryGetValueMethod
object myObject = null;
myDic.TryGetValue("test", out myObject);

MyCustomType t1 = (MyCustomType) myObject;

//Direct lookup method
try
{
     MyCustomType t2 = (MyCustomType) myDic["test"];
     //Do something here...
} catch {}

你认为哪种方法更受欢迎?第二个是更干净的编码,因为没有额外的铸件,但我认为它比第一个效率低,因为它没有异常。

4

3 回答 3

5

MSDN 说“使用这种方法 [TryGetValue] 比捕获由 Item 属性抛出的 KeyNotFoundException 更有效。”

它还解释说TryGetValue “结合了ContainsKey方法的功能和 Item 属性” ..

您还应该只捕获该特定异常而不是所有异常。

更新:从 C# 7 开始,您现在可以编写:

if (myDic.TryGetValue("test", out MyCustomType value)) {
   // do something with value
}
于 2013-06-03T22:15:45.187 回答
4

我认为您不应该使用try/catch来形成这样的逻辑路径。Exceptions 应该是例外情况,其中出现了“错误”。

就个人而言,我更喜欢ContainsKey

if (myDic.ContainsKey("test")) {
   MyCustomType value = myDic["test"];
   // do something with the value
}

如果您认为找不到密钥意味着某些事情“出错”,那么我会省略测试,如果找不到密钥则抛出异常。

编辑:这些天我尝试TryGetValue改用。它稍微笨拙一些,但是一旦你习惯了它,它就不会那么糟糕了。

MyCustomType value;
if (myDic.TryGetValue("test", out value)) {
   // do something with value
}

EDIT2:现在out var我肯定会使用TryGetValue更多。同样,您可以编写一个CantGetValue方法(与相反的布尔结果相同),因为大多数时候您想在没有值时做一些额外的事情而不是在有值时。

if (dict.TryGetValue("test", out var value)) {
   // do something with value
}

// or

if (cache.CantGetValue("test", out var cachedValue)) {
   // cache value
}
// make use of value
于 2013-06-03T22:13:14.913 回答
0

如果您可以安全地预测密钥应该始终存在,则将其包装在 Try ... Catch 中。这样,只有在出现问题时才会抛出异常。

TryGetValue是一个更好的选择 -Dictionary.ContainsKey(key)一样好 - 最终它与TryGetValue幕后做同样的事情。

于 2013-06-03T22:16:03.690 回答