Parse 诉 TryParse

Posted

技术标签:

【中文标题】Parse 诉 TryParse【英文标题】:Parse v. TryParse 【发布时间】:2010-10-02 19:53:54 【问题描述】:

Parse() 和 TryParse() 有什么区别?

int number = int.Parse(textBoxNumber.Text);

// The Try-Parse Method
int.TryParse(textBoxNumber.Text, out number);

是否有某种形式的错误检查,例如 Try-Catch 块?

【问题讨论】:

【参考方案1】:

如果字符串不能转换为整数,则

int.Parse() 会抛出异常 int.TryParse() 将返回 false(但不会抛出异常)

【讨论】:

如果我使用 int.TryParse(some_method_that_throws_exception(), out int test) 会怎样?它会捕获任何异常还是仅捕获与解析相关的异常? @AlexandruAntochi 您不应该将问题作为评论提出。这将使其他人几乎不可能从有用的答案中受益。但是,为了值得您花时间,您的问题的答案是否定的, int.TryParse 根本不会抛出。如果方法解析失败,它只会通过返回值 false 来反映这一点。这使得使用 if(int.TryParse... 仅在解析成功时才执行某些操作变得很方便。【参考方案2】:

我知道这是一篇很老的帖子,但我想分享一些关于 Parse 与 TryParse 的更多细节。

我有一个场景需要将 DateTime 转换为 String,如果 datevalue 为 null 或 string.empty,我们将面临异常。为了克服这个问题,我们将 Parse 替换为 TryParse,并将获取默认日期。

旧代码:

dTest[i].StartDate = DateTime.Parse(StartDate).ToString("MM/dd/yyyy");
dTest[i].EndDate = DateTime.Parse(EndDate).ToString("MM/dd/yyyy");

新代码:

DateTime startDate = default(DateTime);
DateTime endDate=default(DateTime);
DateTime.TryParse(dPolicyPaidHistories[i].StartDate, out startDate);
DateTime.TryParse(dPolicyPaidHistories[i].EndDate, out endDate);

必须声明另一个变量并用作 TryParse 的 Out。

【讨论】:

您不需要初始化startDateendDate,因为DateTime.TryParse 将始终用DateTime.MinValue 覆盖它们。如果不正确的日期表示应转换为不同的值,请检查 DateTime.TryParse 的返回值,如果为 false,请显式设置该值。 使用DateTime?DateTime 可为空【参考方案3】:

作为记录,我正在测试两个代码:只是尝试从字符串转换为数字,如果失败则将数字分配为零。

        if (!Int32.TryParse(txt,out tmpint)) 
            tmpint = 0;
        

和:

        try 
            tmpint = Convert.ToInt32(txt);
         catch (Exception) 
            tmpint = 0;
        

对于 c#,最好的选择是使用 tryparse,因为 try&Catch 替代抛出异常

A first chance exception of type 'System.FormatException' occurred in mscorlib.dll

这是令人痛苦的缓慢和不可取的,但是,除非调试的异常被解决,否则代码不会停止。

【讨论】:

第一个代码片段没有做任何事情,因为如果字符串不能被解析为 int,tmpint 已经被设置为零。【参考方案4】:

double.Parse("-");引发异常,而 double.TryParse("-", out parsed);解析为 0 所以我猜 TryParse 会进行更复杂的转换。

【讨论】:

但是TryParse 是否返回truefalse?这样您就可以知道它是否“有效”。【参考方案5】:

TryParse and the Exception Tax

如果从字符串到指定数据类型的转换失败,Parse 会引发异常,而 TryParse 会明确避免引发异常。

【讨论】:

如果您为大多数完整的 TryParse 方法传入 null,TryParse 将引发异常。 很好的链接。令我惊讶的是,还没有人开始讨论“哪个最好或应该应用哪种编码实践”。【参考方案6】:

Parse 如果无法解析该值,则抛出异常,而 TryParse 返回一个 bool 指示它是否成功。

TryParse 不仅仅在内部try/catch - 它的全部意义在于它没有例外地实现,因此它很快。事实上,它最有可能实现的方式是,Parse 方法在内部会调用TryParse,如果它返回false,则抛出异常。

简而言之,如果您确定该值有效,请使用Parse;否则使用TryParse

【讨论】:

"在内部 Parse 方法将调用 TryParse" 除了 Parse 早于 TryParse 几个版本。当然,他们本可以将核心实现转移到 TryParse... @Joel - 我以为他们会移动实现,但我只是看了一下反射器,它们是单独的实现,exactly除了一个有' throw ...',一个有'return false'。我想知道为什么它们没有合并?! 尽管考虑一下,Parse 会抛出许多不同的异常,所以如果它只有一个来自 TryParse 的布尔值,那么它就不会知道要抛出哪个异常。 "如果您确定该值有效,请使用 Parse"。我要补充一句,“但你承认你可能错了”。如果您 100% 确定它可以解析,那么您可以正确使用 TryParse,它可能会更快。 通过“不同的例外”,@GregBeech 表示消息,而不是类。【参考方案7】:

TryParse 不返回值,它返回一个状态码来指示解析是否成功(并且不抛出异常)。

【讨论】:

TryParse 确实通过 out 关键字指定的参数二返回值。【参考方案8】:

TryParse 方法允许您测试某些内容是否可解析。如果您在第一个实例中尝试 Parse 时使用无效的 int,则在 TryParse 中会出现异常,它会返回一个布尔值,让您知道解析是否成功。

作为脚注,将 null 传递给大多数 TryParse 方法将引发异常。

【讨论】:

将 null 传递给基本类型(int、double、DateTime 等)不会引发异常

以上是关于Parse 诉 TryParse的主要内容,如果未能解决你的问题,请参考以下文章

Phusion 乘客诉 WEBrick

区块链技术如何在涉诉信访中显身手

区块链技术如何在涉诉信访中显身手

山寨电子烟再引风波,悦刻连诉三家侵权品牌

minecraft我的世界gradle构建,总是失败,求告诉详细教程。不要发网址,要会的人。不会的

SCO诉IBM案历时18年终以1425万美元和解