当TryParse()已经存在时,为什么需要Parse() ?



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()。前者表示序列/集合永远不能为空。

最新更新