Parse()
方法在内置值类型中可用,当发现不兼容的类型时抛出异常。未处理的异常不是一件好事。因此c#还在内置值类型中提供了名为TryParse()
的方法,该方法处理错误(如果有的话),并返回一个布尔值响应。
说明TryParse()
优于Parse()
。那么为什么c#中需要Parse()
呢?什么时候需要?在哪些情况下我们应该选择Parse()
而不是TryParse()
?
所以TryParse()比Parse()好
不总是正确的。有时您知道可以将值解析为目标类型。在这种情况下,你宁愿写:
T result = T.Parse(value);
或:
T result;
if (T.TryParse(value, out result)
{
/* Do something */
}
你认为哪一个更好?
我们应该选择Parse()而不是TryParse的场景是什么?
下面是一个现实生活中的例子:
var matches = Regex.Matches(s, "^([0-9]{1,3})-", RegexOptions.Multiline);
foreach (var match in matches)
int number = int.Parse(match.Groups[1].Value);
在这里,我们有一个regex匹配的事实足以让我们知道第1组保存一个整数。那么,为什么我们要写成这样呢?
foreach (var match in matches)
{
int number;
if (int.TryParse(match.Groups[1].Value, out number)
{
}
}
理论上,我们可以这样写:
int.TryParse(match.Groups[1].Value, out int number)
…然后立即使用number
,但是
使用名为
TryXXXX
的方法而不检查返回的bool
是非常尴尬的。内联
out
变量在c# 7.0之前是不存在的。
同样,使用Parse()
vsTryParse()
传达意图。如果我使用Parse()
,它指示下一个阅读我的代码的人(这可能是未来的我),这应该永远不会失败,如果它这样做,那么一些可怕的错误。这类似于使用IEnumerable.First()
和IEnumerable.FirstOrDefault()
。前者表示序列/集合永远不能为空。