什么时候是“尝试”?应该在c#方法名中使用
本文关键字:方法 尝试 什么时候 | 更新日期: 2023-09-27 18:19:22
我们正在和同事讨论如果方法名以"Try"开头意味着什么。
有以下意见:
- 当方法可以返回空值时使用"Try"。
- 当方法不会抛出异常时使用"Try"。
官方定义是什么?"Try"在方法名中表示什么?有关于这个的官方指南吗?
这被称为TryParse模式,并已被Microsoft记录。官方异常和性能MSDN页面说:
因此,如果您的代码在常规用例中可能会抛出异常(例如解析int),则TryParse模式是有意义的。考虑在常见场景中可能抛出异常的成员使用TryParse模式,以避免与异常相关的性能问题。
(更正)正如Erik建议的那样,有官方指导方针。
当我看到TrySomething
方法时,我假设它
- 不把
- 返回
bool
- 如果我期望的值,它是通过'out'参数返回
- 存在
Something
方法,允许我自己处理任何异常。(编辑,由Jesse Webb建议)
我认为你应该使用try
当你想继续。方法是否返回值并不重要。
情况1:如果返回fine,则可以以某种方式继续。
情况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
值的函数。
最后,这些都是关于您决定在您的组中使用的命名约定。
确保在你的methodname中包含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
方法的责任。
Microsoft的TryParse
模式违反了干净代码指南,该指南说我们应该避免输出参数。
如果我们不开发新版本的c#,我们就不必遵守所有微软的指导方针。有时候他们并不是最好的。