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

ren*_*rof 59 .net c# parsing type-conversion tryparse

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

bool parsed = int.TryParse(string, out num);
if (parsed)
...
Run Code Online (Sandbox Code Playgroud)

要么

try {
    int.Parse(string);
}
catch () {
    do something...
}
Run Code Online (Sandbox Code Playgroud)

Fre*_*örk 82

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

  • 输入为空
  • 输入的格式不正确
  • 输入包含一个产生溢出的数字

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

一如既往,背景是王道.

  • 虽然我同意上下文为王的一般主旨,但我会说TryParse几乎总是*更好,它不仅仅是一个非常主观的个人偏好.您的反例(区分可以抛出的不同异常)是相当不寻常的,并且可能更好地使用每个异常类型的catch块而不是catch all编码. (2认同)
  • @Joe:是的,如果你想区分不同的异常类型,除了特定的 catch 块之外的任何东西都会显得很奇怪。我的回答旨在讨论“Parse”与“TryParse”,而不是问题中的具体代码示例。正如我在评论中其他地方提到的,我同意 `TryParse` 是*几乎总是*更好的方法,但关键字是“几乎”,而不是“总是”。 (2认同)

Eri*_*ert 39

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


gre*_*g84 20

如果确实预期转换有时会失败,我喜欢int.TryParse条件(Ternary)运算符的一行上使用和整齐地使用,如下所示:

int myInt = int.TryParse(myString, out myInt) ? myInt : 0;
Run Code Online (Sandbox Code Playgroud)

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

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

  • 正确,但在我的版本中你可以指定一个*alternative*默认值,例如`10`. (3认同)

Geo*_*ton 10

首先.第二个被认为是异常编码.


Pad*_*ddy 8

就个人而言,我更喜欢:

if (int.TryParse(string, out num))
{
   ...
} 
Run Code Online (Sandbox Code Playgroud)