为什么所有TryParse重载都有out参数?

时间:2013-10-25 14:07:04

标签: c# tryparse

我发现很多次我不需要TryParse方法的out参数,但问题是必然的。在这里,我将展示一个不需要它的例子。

我想检查字符串是否为整数,如果是整数则打印“整数”;否则,打印“不是整数”。所以这是代码:

string value = Console.ReadLine(); //Get a value from the user.
int num; //Why should I have it?? No need at all !

if (int.TryParse(value, out num))
{
    Console.WriteLine("An integer");
}
else
{
    Console.WriteLine("Not an integer");
}

我只是想知道为什么TryParse总是返回一个out参数?为什么没有out参数就没有过载?

4 个答案:

答案 0 :(得分:27)

更新了答案:

在更新版本的C#中,您可以声明输出参数inline,这样您就可以删除示例中不需要的代码行:

string value = Console.ReadLine(); //Get a value from the user.

if (int.TryParse(value, out int num))
{
    Console.WriteLine("An integer");
}
else
{
    Console.WriteLine("Not an integer");
}

您可以简单地忽略代码中的结果,不再有额外的行。你还有额外的参数,但是呢?

潜在的“为什么”仍然是相同的,不太可能改变。该方法需要返回两个内容,一个bool表示成功,一个int表示成功后的结果值。 (我想不出另一种传达结果的方法,可以吗?)因为一个方法只能返回一个东西,而自定义结果类型似乎有点矫枉过正,所以决定返回bool并将结果设为out参数。一旦做出决定,就必须保持语言的持续时间。

“他们”当然可以添加不在int值中输出的重载。但为什么?为什么要花费大量精力进行设计,记录,测试,并且正如我们所见,永久支持一种无用的方法,但为极少数开发人员节省了一些按键?再次,非常不可能。

对于此类功能,欢迎您propose a change。我想,接受提案会很酷。我怀疑这个会是什么,但是如果你对它充满热情,那么无论如何都要有它。


原始答案:

简短的回答是,“因为这就是方法的定义方式。”也许是C#语言团队中的某个人可能会发现这个问题,并为为什么做出决策提供推理,但此时并没有太大的改变。 C#是一种静态编译的语言,方法签名需要匹配,所以就是这样。

(想象一下,如果他们改变了这一点并在所有现有代码库中打破.TryParse()。这将是......糟糕。)

但是,您可以在自己的代码中解决此问题。像扩展方法这样简单的东西可以帮到你:

public static bool IsInt(this string s)
{
    int x = 0;
    return int.TryParse(s, out x);
}

然后在您的代码中,您只需要从字符串值调用该方法:

string value = Console.ReadLine();
if (value.IsInt())
    Console.WriteLine("An integer");
else
    Console.WriteLine("Not an integer");

答案 1 :(得分:6)

它有out参数,因为绝大多数时候人们使用它,他们想要解析的int(或double,或decimal,或datetime,或其他)。

如果你不想/需要解析的值,并且你发现自己一直这样做,你可以在.TryParse()上编写自己的“包装器”,它只接受字符串。

在这个例子中(你可以使它更通用,我敢肯定)你可以做类似

的事情
public static bool TryParseNoOutput(this string value)
{
  int noNeed = 0;
  return int.TryParse(value, out noNeed);
}

然后在你的代码中(在这种情况下)你会打电话:

string value = Console.ReadLine();
if(value.TryParseNoOutput()) Console.WriteLine("An Integer");
else Console.WriteLine("Not an integer."):

编辑:正如评论中指出的那样,当我将其定义为字符串的扩展名时,我尝试调用“int.TryParseNoOutput”。答案已更新,以反映这一点。

答案 2 :(得分:5)

TryParse是一项相对复杂的操作,用于确定int的{​​{1}}表示。如果有一个重载只返回string,很多(没有经验的)开发人员很可能会遵循这种低效的模式:

bool

答案 3 :(得分:3)

为什么TryParse有一个out参数?
有关如何实施TryParse的非常简单的原因 您确定某些内容是否可解析的方法是解析它!如果你能够解析某些东西,那么它是可以解析的。如果你无法解析它,那么它是不可解析的。

因此,通过确定某些内容是否可解析,如果 可解析,那么我们已经解析了它!抛弃这个解析后的值(任何想知道某些东西是否可解析的人都可能对解析后的结果感兴趣)都是愚蠢的,所以返回解析后的值。

它有一个out参数,因为解析的值是真正返回的TryParse调用的副产品。