int.Parse()、int.TryParse()和Convert.Int32()中哪个处理和转换更快?

5
哪一个更快、更强大和可靠?为什么?
int.Parse()
int.TryParse()
Convert.ToInt32()
6个回答

9

如果您不确定字符串是否可解析,则使用int.TryParse()比使用其他方法(如Parse和ConvertTo)并捕获异常要快得多。请阅读此文以获取更多信息。


5
Convert.Int32()调用带有额外null检查的Int32.Parse(), 所以Int32.Parse()可能会稍微慢一些。这就是为什么Convert.Int32()会更快(因为它在Int32.Parse()之前捕获了null)。 Int32.Parse()在内部调用Number.ParseInt32(),当无法解析数字时抛出异常。 Int32.TryParse()在内部调用Number.TryParseInt32(),其代码与Number.ParseInt32()类似,但不像抛出异常那样消耗资源,而是直接返回false。
考虑到所有这些变量,我的猜测是Int32.TryParse()将为非null值提供最快的结果。如果大多数调用可能包含null,则我认为Convert.Int32()的性能会更好。
......以上内容由.NET Reflector提供。

+1,但是关于“所以Int32.Parse()可能会稍微快一点”的问题:我猜你无法测量空值检查。实际上,如果您的输入为null,它将会更慢,根据http://blogs.msdn.com/b/ianhu/archive/2005/12/19/505702.aspx:“区别在于,正如我们所猜测的那样,在异常处理代码中。这就是为什么Convert比Parse更快,因为Convert可以处理坏数据集中的空字符串而不抛出异常。” - Dirk Vollmar
@0xA3 更新了我的回答以反映评论。感谢您的指正(和参考)。 - Justin Niessner

0

我个人使用

int.Parse(...)

如果我有一个字符串作为源码并且

Convert.ToInt32(...)

如果我的源类型是值类型(double、decimal),否则我就必须将其转换为字符串并处理本地文化。

1
如果我想在解析字符串时引发异常(即API期望查询字符串参数作为页面编号或其他内容),我会使用int.Parse。如果我想立即处理它,我会在解析字符串时使用int.TryParse。如果不是字符串(无论是十进制数、封装在对象中的整数还是其他类型),我会使用Convert.ToInt32。所以我和你的想法一致。 :-) - Jaxidian

0

无论是使用 int.Parse 还是 Convert.Int32,它们在内部都会调用 int.TryParse,所以它们之间的性能差异应该微不足道。 TryParse 是最通用的方法,因为它允许你决定是否抛出异常,但除此之外这些方法之间并没有区别。


2
实际上,如果你在 Reflector 中查看,int.Parse 内部调用了 Number.ParseInt32...它从未调用 int.TryParse。 - Justin Niessner
我也是这么想的。我正准备打开一些源代码,不过我会把你的信息当作确认。 - Jaxidian

0

Convert.ToInt32(string) 调用 Int32.Parse(string)。

然而,如果您使用 Int32.Parse(或等效的 int.Parse),则可以指定在解析时使用的全球化和格式。

Int.Parse 会更快,因为它不执行 try/catch。

Int.TryParse 更可靠,如果您没有传递无法转换的值,则不会引发错误。


实际上,如果你在 Reflector 中查看,int.Parse 内部调用 Number.ParseInt32...它从不调用 int.TryParse。 - Justin Niessner
1
@Ed:谁说TryParse必须以Parse为基础实现,而不是反过来呢? - BlueRaja - Danny Pflughoeft
1
这在某种程度上与Jaxidian提到的基准测试中的内容相矛盾。根据那个测试,int.Parse不会更快。 - Dirk Vollmar
3
在TryParse中也没有try/catch。如果你查看被调用的内部代码,你会发现,当Parse抛出异常时,TryParse只是返回false。抛出异常会增加额外的开销,从而减慢速度。 - Justin Niessner

0

我发现答案取决于上下文。

如果我将一个 DataRow 转换为对象,我会有很多 Convert.ToXXX 的调用,所以我会使用 Convert.ToInt32,因为这与该转换周围的其他语句一致。

在其他情况下,如果我想在字符串无法解析时抛出异常(快速失败),我会使用 int.Parse,因为它会为我抛出异常,而 int.TryParse 倾向于生成更丑陋的代码(我从来不喜欢输出参数)。

如果我只想在字符串无法解析时指定一些默认值,我会使用 int.TryParse,否则,我就必须自己处理异常,这既昂贵又丑陋。

然而,除非您调用解析站点数十亿次,否则我会惊讶地看到任何三种格式之间存在可辨别的时间差异,因此我更喜欢一个更易读的代码片段,而不是一个微不足道的更快变体。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接