194

我们正在与我们的同事讨论如果方法名称以“Try”开头意味着什么。

有以下意见:

  • 当方法可以返回空值时使用“尝试”。
  • 当方法不会抛出异常时使用“Try”。

官方定义是什么?方法名称中的“Try”是什么意思?有没有关于这方面的官方指南?

4

6 回答 6

158

这称为TryParse模式,并且已由 Microsoft 记录。官方的异常和性能 MSDN 页面说

考虑在常见情况下可能会抛出异常的成员的 TryParse 模式,以避免与异常相关的性能问题。

因此,如果您的代码的常规用例意味着它可能会引发异常(例如解析 int),那么TryParse模式是有意义的。

于 2013-06-20T07:35:01.600 回答
128

(更正)正如 Erik 建议的那样,有官方指南。

当我看到TrySomething方法时,我假设它

  • 不扔
  • 返回bool
  • 如果我期望值,则通过“out”参数返回
  • 存在Something方法,允许我自己处理任何异常。(编辑,由 Jesse Webb 建议)
于 2013-06-20T07:31:06.680 回答
9

我认为您应该try在要继续时使用。方法是否返回某个值并不重要。

案例1:如果它返回正常,你可以以某种方式继续。

情况2:如果不返回:还是可以的;您可以通过其他方式进行。

如果您期望某个值作为该方法的输出,则使用该out参数。

例子

int value
if (dictionary.TryGetValue("key", out value))
{
    // Proceed in some way
}
else
{
    // Proceed in some other way
}
于 2013-06-20T10:13:00.127 回答
6

当您想表明方法调用可能产生无效结果的事实时,您必须在方法名称中使用“Try”。顺便说一下,按照 .NET 标准,它不是引发异常的函数,而是从程序的角度返回一些VALID或值的函数。NON_VALID

最后,这一切都与您决定在组中使用的命名约定有关。

于 2013-06-20T07:32:43.907 回答
6

如果出现以下情况,请确保包含try在您的方法名称中:

  • 你不会抛出任何异常
  • 您的方法具有以下签名:bool TrySomething(input, out yourReturn)

所以基本上如果我们使用try-methods 我们只能得到一个布尔结果。

所以下面的代码不会抛出任何异常:

string input = "blabla";
int number;
if (int.TryParse(input, out number))
{
// wooohooo we got an int!
} else
{
//dooh!
}

而这段代码可以(并且在这种情况下会)抛出异常:

string input = "blabla";
int number;
try
{
     number = int.Parse(input); //throws an exception
}
catch (Exception)
{
     //dooh!
}

使用 Try 方法是一种更安全、更具防御性的编码方式。此外,如果代码片段 #2 不是整数,则它需要更多的性能来执行。

于 2013-06-22T23:37:44.987 回答
-1

Bob 大叔在他的书Clean Code中给出了下面的例子。每当我们期望抛出异常时,我们可以使用Try方法名称的前缀:

public void sendShutDown()
{
    try{
        tryToShutDown();
    } catch (DeviceShutDownError e) {
        logger.log(e);            
    }
}

然后(改编):

private void tryToShutDown()
{
    //some code with no error handling, but
    //something might go wrong here
}

tryToShutDown方法不进行任何错误处理,因为这是该sendShutDown方法的责任。

微软的TryParse模式违反了干净的代码准则,即我们应该避免输出参数。

如果我们不开发新版本的 C#,我们不必遵守所有 Microsoft 准则。有时他们不是最好的。

于 2019-07-29T19:23:47.387 回答