解析v.TryParse


111

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

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

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

是否存在某种形式的错误检查,例如“尝试捕获”块?

Answers:


155

Parse如果无法解析该值,则引发异常,而TryParse返回bool指示其是否成功的异常。

TryParse不只是try/ catch内部-它的全部意义在于,它是没有例外,使其快速实现。实际上,最有可能实现该Parse方法的方法是在内部调用该方法TryParse,如果该方法返回则抛出异常false

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


1
“内部Parse方法将调用TryParse”,但Parse在TryParse之前有多个版本。当然,他们可以将核心实现转移到TryParse ...
Joel Coehoorn

4
@Joel-我以为他们会移动实现,但是我只是看了一下反射器,它们是具有完全相同的代码的独立实现,除了一个有“ throw ...”和一个“ return false”之外。我不知道为什么他们没有合并?
格雷格·比奇

6
尽管考虑一下,Parse引发了许多不同的异常,所以如果它只是TryParse的布尔值,那么它将不知道要抛出哪个异常。
格雷格·比奇

5
“如果您确定该值将有效,请使用Parse”。我要补充一点,“但您承认您可能错了的可能性”。如果您100%确信它可以解析,则可以正确地使用TryParse,它可能会更快。
2013年

2
通过“不同的异常”,@ GregBeech表示消息,而不是类。
Paul Draper 2013年

26

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

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

如果我使用int.TryParse(some_method_that_throws_exception(),经过int测试)怎么办?它会捕获任何异常还是仅捕获与解析相关的异常?
亚历山德鲁·安托奇

@AlexandruAntochi您不应提出问题作为评论。这将使其他人几乎不可能从有用的答案中受益。但是,为了让您花点时间,对您的问题的答案是“否”,int.TryParse根本不会抛出。如果该方法无法解析,它将仅通过返回值false反映出来。这使得如果(int.TryParse使用它方便......如果解析成功只做些什么。
罗布

3

TryParse方法允许您测试某些东西是否可解析。如果您像第一个实例中那样使用无效的int尝试解析,则在TryParse中会收到一个异常,它返回一个布尔值,让您知道解析是否成功。

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


将null传递给基本类型(int,double,DateTime等)不会引发异常
Dr Yunke '18

3

TryParse和例外税

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


如果为大多数完整的TryParse方法传递null,则TryParse将引发异常。
2009年

1
很棒的链接。令我感到惊讶的是,没有人还没有开始“哪种方法最好或应该采用哪种编码实践”的讨论。
Christian Madsen


0

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

        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

令人痛苦的缓慢和令人不快的是,但是,除非Debug的异常被解决以停止它,否则代码不会停止。


第一个代码片段不执行任何操作,因为如果无法将字符串解析为int,则tmpint将已经设置为零。
Andrew Neely 2015年

0

我知道这是一个非常古老的文章,但是想分享更多有关Parse vs TryParse的细节。

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

旧代码:

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。


你并不需要初始化startDate,并endDateDateTime.TryParse将始终以覆盖它们DateTime.MinValue。如果错误的日期表示形式应转换为其他值,请检查的返回值;DateTime.TryParse如果返回的值为false,则应明确设置该值。
Palec '17

使用DateTime?DateTime可为空
Kiquenet

-1

double.Parse(“-”); 引发异常,而double.TryParse(“-”,已解析);解析为0,所以我想TryParse会执行更复杂的转换。


4
但是TryParse返回true还是false?这样您将知道它是否“有效”。
Paul Draper 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.