使用它似乎是一种合理的模式:
int.TryParse()
简单如果,而不是:
int.Parse()
在try块内。直到我发现这个样本在MS模式&做法
/// <summary>
/// Update a setting value for our application. If the setting does not
/// exist, then add the setting.
/// </summary>
/// <param name="Key"></param>
/// <param name="value"></param>
/// <returns></returns>
public bool AddOrUpdateValue(string Key, Object value)
{
bool valueChanged = false;
try
{
// if new value is different, set the new value.
if (isolatedStore[Key] != value)
{
isolatedStore[Key] = value;
valueChanged = true;
}
}
catch (KeyNotFoundException)
{
isolatedStore.Add(Key, value);
valueChanged = true;
}
catch (ArgumentException)
{
isolatedStore.Add(Key, value);
valueChanged = true;
}
catch (Exception e)
{
Debug.WriteLine("Exception while using IsolatedStorageSettings: " + e.ToString());
}
return valueChanged;
}
使用Contains方法是不是更好?另一方面,我已经读过CLR可以优化try-catch到简单的转到。
答案 0 :(得分:4)
是的,不要为此使用catch块。我不确定你在哪里找到这些代码,但我怀疑它是不可思议的老。 Contains()方法要快得多。另外,请查看字典类的TryGetValue()方法。
答案 1 :(得分:2)
我不确定IsolatedStore应该是什么类型,但如果它是一个Dictionary,那么isolatedStore.TryGetValue(key, out value)
将是我首选的检查方式。
对于赋值,isolatedStore[key] = value
应该永远不会抛出异常,除非key为null,这对于调用者来说似乎是公平的。从本质上讲,使用索引器本身就是一个添加或更新操作,虽然它不会告诉你以前是否存在该值。
是的,就像int.Parse
vs int.TryParse
一样,更喜欢为您提供可以处理的响应的方法(如TryGetValue
),而不是抛出异常的方法(至少在可恢复的情况下)像这样的情况)。
Ben Voigt提出了一个关于线程安全的重点。使用TryGetValue并使用indexer (isolatedStore[key])
而不是.Add()
分配值将消除任何异常,但操作仍然不是原子的。
答案 2 :(得分:1)
我运行测试并且TryParse运行速度比Parse快得多,因为如果Parse失败,.NET似乎花了很多时间生成抛出异常,但在TryParse中它只能抛出“假”。 / p>
我不确定任何一个是“更好”,但我的测试表明TryParse似乎更快,我认为TryParse使得代码比许多try / catch块更易读。
编辑:您的代码示例似乎与int解析没有任何关系。
答案 3 :(得分:1)
TryGetValue
优于Contains
,因为它避免了竞争条件。但是如果你有多个线程访问字典,你将不得不以这种或那种方式处理异常,尽管你可以最小化你支付异常罚款的次数。