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。
【讨论】:
您不需要初始化startDate
和endDate
,因为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
是否返回true
或false
?这样您就可以知道它是否“有效”。【参考方案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的主要内容,如果未能解决你的问题,请参考以下文章