65

我知道..我知道...性能不是这里的主要关注点,只是出于好奇,什么更好?

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

或者

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

9 回答 9

90

更好是高度主观的。例如,我个人更喜欢int.TryParse,因为我通常不关心解析失败的原因,如果它失败了。但是,int.Parse可以(根据文档)抛出三个不同的异常:

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

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

一如既往,语境为王。

于 2011-02-09T13:56:38.833 回答
40

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

于 2011-02-09T15:16:22.767 回答
24

如果确实预计转换有时会失败,我喜欢使用int.TryParseand 这样整齐地与条件(三元)运算符放在一起,如下所示:

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

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

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

于 2012-04-18T22:25:59.547 回答
11

首先。第二种被认为是异常编码

于 2011-02-09T13:53:22.827 回答
8

就个人而言,我更喜欢:

if (int.TryParse(string, out num))
{
   ...
} 
于 2011-02-09T13:54:41.027 回答
4

首先!您不应该按异常编码。

你可以把它缩短为

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

于 2011-02-09T13:55:04.933 回答
3

首先,到目前为止。正如乔治所说,第二个是异常编码,对性能有重大影响。性能应该始终是一个问题。

于 2011-02-09T13:55:25.517 回答
2

捕获异常需要更多开销,所以我会选择 TryParse。

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

最后一部分从这里复制粘贴

于 2011-02-09T13:56:01.813 回答
1

要记住的另一件事是异常记录(可选)在 Visual Studio 调试/输出窗口中。即使异常的性能开销可能微不足道,调试时为每个异常编写一行文本也会减慢速度。更值得注意的异常也可能淹没在失败的整数解析操作的所有噪音中。

于 2011-02-09T15:28:22.743 回答