【问题标题】:Parse v. TryParseParse 诉 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 块?

【问题讨论】:

    标签: c# parsing integer tryparse


    【解决方案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 等)不会引发异常
    猜你喜欢
    • 2019-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-07
    相关资源
    最近更新 更多