我知道......我知道......这里的表现不是主要关注的问题,但只是出于好奇,还有什么更好的?
bool parsed = int.TryParse(string, out num);
if (parsed)
...
OR
try {
int.Parse(string);
}
catch () {
do something...
}
答案 0 :(得分:81)
更好是非常主观的。例如,我个人更喜欢int.TryParse
,因为我经常不关心为什么解析失败,如果失败。但是,int.Parse
可以(根据documentation)抛出三个不同的例外:
如果你关心它失败的原因,那么int.Parse
显然是更好的选择。
一如既往,语境是王道。
答案 1 :(得分:39)
异常转换有时会失败,还是预期和正常转换有时会失败?如果是前者,请使用例外。如果是后者,避免例外。出于某种原因,例外被称为“例外”;你应该只使用它们来处理特殊的情况。
答案 2 :(得分:19)
如果确实预计转换有时会失败,我希望int.TryParse
使用conditional (Ternary) operator这样整齐地使用{{3}},就像这样:
int myInt = int.TryParse(myString, out myInt) ? myInt : 0;
在这种情况下,如果TryParse方法失败,则零将用作默认值。
对于可空类型也非常有用,如果转换失败,它将覆盖null
的任何默认值。
答案 3 :(得分:10)
第一个。第二个被视为按例外编码。
答案 4 :(得分:8)
就个人而言,我更喜欢:
if (int.TryParse(string, out num))
{
...
}
答案 5 :(得分:4)
第一个!您不应该例外编码。
你可以将它缩短为
if (int.TryParse(string, out num))
答案 6 :(得分:3)
首先,到目前为止。正如George所说,其次是异常编码并且会对性能产生重大影响。而且,性能应始终是一个问题。
答案 7 :(得分:2)
捕获异常会产生更多开销,因此我会选择TryParse。
另外,如果转换失败,TryParse方法不会抛出异常。它消除了在s无效且无法成功解析的情况下使用异常处理来测试FormatException的需要。
最后一部分是从here
复制粘贴的答案 8 :(得分:1)
要记住的其他事项是在Visual Studio调试/输出窗口中记录(可选)异常。即使异常的性能开销可能无关紧要,在调试时为每个异常写一行文本也会使事情变慢。更值得注意的例外可能会在失败的整数解析操作的所有噪声中被淹没。