更好的是:int.TryParse或try {int.Parse()} catch

时间:2011-02-09 13:52:16

标签: c# .net parsing type-conversion tryparse

我知道......我知道......这里的表现不是主要关注的问题,但只是出于好奇,还有什么更好的?

bool parsed = int.TryParse(string, out num);
if (parsed)
...

OR

try {
    int.Parse(string);
}
catch () {
    do something...
}

9 个答案:

答案 0 :(得分:81)

更好是非常主观的。例如,我个人更喜欢int.TryParse,因为我经常不关心为什么解析失败,如果失败。但是,int.Parse可以(根据documentation)抛出三个不同的例外:

  • 输入为空
  • 输入格式无效
  • 输入包含一个生成溢出的数字

如果你关心它失败的原因,那么int.Parse显然是更好的选择。

一如既往,语境是王道。

答案 1 :(得分:39)

异常转换有时会失败,还是预期和正常转换有时会失败?如果是前者,请使用例外。如果是后者,避免例外。出于某种原因,例外被称为“例外”;你应该只使用它们来处理特殊的情况。

答案 2 :(得分:19)

如果确实预计转换有时会失败,我希望int.TryParse使用conditional (Ternary) operator这样整齐地使用{{3}},就像这样:

int myInt = int.TryParse(myString, out myInt) ? myInt : 0;

在这种情况下,如果TryParse方法失败,则零将用作默认值。

对于可空类型也非常有用,如果转换失败,它将覆盖null的任何默认值。

答案 3 :(得分:10)

第一个。第二个被视为按例外编码

答案 4 :(得分:8)

就个人而言,我更喜欢:

if (int.TryParse(string, out num))
{
   ...
} 

答案 5 :(得分:4)

第一个!您不应该例外编码。

你可以将它缩短为

if (int.TryParse(string, out num))

答案 6 :(得分:3)

首先,到目前为止。正如George所说,其次是异常编码并且会对性能产生重大影响。而且,性能应始终是一个问题。

答案 7 :(得分:2)

捕获异常会产生更多开销,因此我会选择TryParse。

另外,如果转换失败,TryParse方法不会抛出异常。它消除了在s无效且无法成功解析的情况下使用异常处理来测试FormatException的需要。

最后一部分是从here

复制粘贴的

答案 8 :(得分:1)

要记住的其他事项是在Visual Studio调试/输出窗口中记录(可选)异常。即使异常的性能开销可能无关紧要,在调试时为每个异常写一行文本也会使事情变慢。更值得注意的例外可能会在失败的整数解析操作的所有噪声中被淹没。