我们正在与我们的同事讨论如果方法名称以“Try”开头意味着什么。
有以下意见:
- 当方法可以返回空值时使用“尝试”。
- 当方法不会抛出异常时使用“Try”。
官方定义是什么?方法名称中的“Try”是什么意思?有没有关于这方面的官方指南?
我们正在与我们的同事讨论如果方法名称以“Try”开头意味着什么。
有以下意见:
官方定义是什么?方法名称中的“Try”是什么意思?有没有关于这方面的官方指南?
这称为TryParse模式,并且已由 Microsoft 记录。官方的异常和性能 MSDN 页面说:
考虑在常见情况下可能会抛出异常的成员的 TryParse 模式,以避免与异常相关的性能问题。
因此,如果您的代码的常规用例意味着它可能会引发异常(例如解析 int),那么TryParse模式是有意义的。
(更正)正如 Erik 建议的那样,有官方指南。
当我看到TrySomething
方法时,我假设它
bool
Something
方法,允许我自己处理任何异常。(编辑,由 Jesse Webb 建议)我认为您应该try
在要继续时使用。方法是否返回某个值并不重要。
案例1:如果它返回正常,你可以以某种方式继续。
情况2:如果不返回:还是可以的;您可以通过其他方式进行。
如果您期望某个值作为该方法的输出,则使用该out
参数。
int value
if (dictionary.TryGetValue("key", out value))
{
// Proceed in some way
}
else
{
// Proceed in some other way
}
当您想表明方法调用可能产生无效结果的事实时,您必须在方法名称中使用“Try”。顺便说一下,按照 .NET 标准,它不是引发异常的函数,而是从程序的角度返回一些VALID
或值的函数。NON_VALID
最后,这一切都与您决定在组中使用的命名约定有关。
如果出现以下情况,请确保包含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 不是整数,则它需要更多的性能来执行。
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 准则。有时他们不是最好的。