更好的是: int.TryParse 或 try int.Parse() catch [关闭]

Posted

技术标签:

【中文标题】更好的是: int.TryParse 或 try int.Parse() catch [关闭]【英文标题】:What is better: int.TryParse or try int.Parse() catch [closed]更好的是: int.TryParse 或 try int.Parse() catch [关闭] 【发布时间】:2011-06-24 03:56:39 【问题描述】:

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

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

try 
    int.Parse(string);

catch () 
    do something...

【问题讨论】:

【参考方案1】:

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

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

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

一如既往,语境为王。

【讨论】:

虽然我同意上下文为王的一般推论,但我想说 TryParse几乎总是更好,但它不仅仅是一个高度主观的个人偏好。您的反例(区分可以抛出的不同异常)是相当不寻常的,并且可能会更好地为每种异常类型编写一个 catch 块而不是全部捕获。 @Joe:是的,如果你想区分不同的异常类型,除了特定的 catch 块之外的任何东西都会显得很奇怪。我的回答旨在讨论ParseTryParse,而不是问题中的具体代码示例。正如我在 cmets 其他地方提到的那样,我同意 TryParse几乎总是更好的方法,但关键字是“几乎”,而不是“总是”。 @Joe:我已经提出了这个论点。请参阅对原始问题的评论交流。 Fredrik 关于绝对陈述永远不正确的权利。 (天哪,一个悖论!) 向国王致敬,宝贝。【参考方案2】:

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

【讨论】:

我喜欢这个解释,因为我解析了大量的用户数据,而失败是否在意料之中(以及当它发生时该怎么办)塑造了整个项目。 Eric,我很想听听你对 boost.org/community/error_handling.html 的看法:“is this an exceptional (or unexpected) situation?'' This guideline has an attractive ring to it, but is usually a mistake... A more appropriate question to ask is: 我们要在这里展开堆栈吗?''” @Jon:我想到了几件事。首先,您不能与重言式争论,即在您想要异常行为的情况下异常是正确的,但您也无法从中学到任何东西。其次,“异常”和“意外”是两个不同的东西。第三,谁说堆栈展开与它有关?这是 C# 的实现细节。异步方法中抛出的异常不会展开堆栈;堆栈早已不复存在。它们向任务发出异常事件发生的信号。不要将语义与实现混淆。 我同意 boost 指导方针提出了一个问题,“我们应该什么时候想要堆栈展开?”,但这句话也是正确的:“问题是一个人的'例外'是另一个人的'预期的'”解析失败是否异常?到达文件末尾是否异常?我们如何客观地确定这一点?【参考方案3】:

如果确实预计转换有时会失败,我喜欢使用int.TryParse 和conditional (Ternary) operator 这样整齐地放在一行中,像这样:

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

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

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

【讨论】:

这完全等同于:int myInt; int.TryParse(myString, out myInt);。 TryParse() 在失败时已经将结果设置为 0。 正确,但在我的版本中,您可以指定 alternative 默认值,例如 10【参考方案4】:

第一个。第二种被认为是异常编码

【讨论】:

【参考方案5】:

就个人而言,我更喜欢:

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

   ...
 

【讨论】:

【参考方案6】:

第一个!您不应该按异常编写代码。

你可以把它缩短为

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

【讨论】:

【参考方案7】:

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

【讨论】:

【参考方案8】:

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

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

最后一部分从here复制粘贴

【讨论】:

【参考方案9】:

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

【讨论】:

以上是关于更好的是: int.TryParse 或 try int.Parse() catch [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

int.Parse()与int.TryParse()

C#的(int) /int.Parse()/int.TryParse()/Convent.ToInt32()的区别--推荐使用Int.TryParse()

将 int.TryParse 与可为空的 int 一起使用 [重复]

如何将 int.TryParse 与可为空的 int 一起使用? [复制]

int.TryParse语法糖

tryParse的用法。