什么时候是;试一试;应该在C#方法名称中使用吗?
我们正在与同事讨论如果方法名称以“Try”开头意味着什么 有以下意见:什么时候是;试一试;应该在C#方法名称中使用吗?,c#,naming-conventions,C#,Naming Conventions,我们正在与同事讨论如果方法名称以“Try”开头意味着什么 有以下意见: 当方法可以返回空值时,请使用“Try” 当方法不会引发异常时,请使用“Try” 官方的定义是什么?“Try”在方法名称中表示什么有关于这方面的官方指南吗?(更正)正如埃里克所建议的,有官方指南 当我看到TrySomething方法时,我假设 不扔 返回bool 如果我期望值,则通过“out”参数返回 存在一种方法,允许我自己处理任何异常。(编辑,杰西·韦伯建议) 当您想要表明方法调用可能产生无效结果的事实时,必须在方法
- 当方法可以返回空值时,请使用“Try”
- 当方法不会引发异常时,请使用“Try”
TrySomething
方法时,我假设
- 不扔
- 返回
bool
- 如果我期望值,则通过“out”参数返回
- 存在一种
方法,允许我自己处理任何异常。(编辑,杰西·韦伯建议)
有效
或无效
值的函数
最后,这些都是关于您决定在组中使用的命名约定。这被称为TryParse模式,并已被Microsoft记录在案。委员会: 考虑在常见场景中可能抛出异常的成员的TryParse模式,以避免与异常相关的性能问题
因此,如果您的代码中有一个常规用例意味着它可能会抛出一个异常(例如解析一个int),那么TryParse模式是有意义的。我认为您应该在想要继续时使用
try
。方法是否返回某个值并不重要
案例1:如果它返回良好,您可以以某种方式继续
案例2:如果不返回:仍然可以罚款;你可以用其他方式继续
如果您希望该方法输出一些值,则使用out
参数
例子
如果出现以下情况,请确保在methodname中包含
try
:
- 你不会抛出任何异常
- 您的方法具有以下签名:
booltrysomething(输入,输出您的返回)
try
-方法,我们只会得到一个布尔结果
因此,以下代码不会引发任何异常:
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!
}
然而,此代码可以(并且在本例中将)引发异常:
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叔叔在其《干净的代码》一书中给出了以下示例。每当我们期望抛出异常时,我们可以使用
Try
前缀作为方法名称:
public void sendShutDown()
{
try{
tryToShutDown();
} catch (DeviceShutDownError e) {
logger.log(e);
}
}
然后(改编):
tryToShutDown
方法不会进行任何错误处理,因为这是sendShutDown
方法的责任
微软的TryParse
模式违反了干净代码准则,即我们应该避免输出参数
如果我们不开发新版本的C#,我们就不必遵守微软的所有准则。有时它们不是最好的。+1那些在函数名称上花了这么多心思的人实际上是在寻找“下一个家伙”。我不知道为什么投票结果很接近(这是一个今晚投了很多票的家伙说的)。@JonathonReinhart,投票结果很接近,因为“目前来看,这个问题不适合我们的问答形式。我们希望答案能得到事实、参考资料或特定专业知识的支持,但这个问题可能会引发辩论、争论、投票或广泛讨论。”微软有一份官方声明回答了这个问题(请参阅我的答案)。这怎么不是事实呢?@PranavHosangadi正如Erik提到的,它是有事实支持的。此外,这里有很多经验丰富的C#开发人员,他们有特定的专业知识来提供有效的答案。见鬼,Eric Lippert是首席C#语言架构师。我想你可以称之为特定的专业知识。@Erikschierbom,这就是MS指南事实。MS指南是正确使用的指南是主观的,有争议的。记录此模式的另一个有用链接(搜索TryParse)基本上,如果你有一个TyPARSE方法,你应该有一个当TryParse返回false时抛出的解析方法。相反,如果你有一个解析方法,你应该考虑使用一个TyPARSE方法,当解析将抛出+1时返回false。“情况。如果您正在做的事情很容易失败,并且失败并不特别明显,那么使用这种模式比尝试/捕获更为惯用,这是基本的东西,但这并不意味着指导方针没有用处。如果你对平台不太熟悉,那么要正确掌握基本的东西可能会很困难。@daveL:是的,这是基本的,但是不同的约定(
parsernull
和Parse
)甚至相反的约定(Parse
和parserrow
)也同样基本。微软指南的好处在于它促进了一致性:当你看一个你不熟悉的代码库时,你仍然可以理解它,因为它(很可能)使用了平台所有者认可的广泛约定。更正-它有官方指南。参见Erik的答案。+1但我还有第四个期望:如果有一个TryFoo
方法,就会有一个类似的Foo
方法,允许我自己处理任何“异常”。这些方法的签名可能会不同,因此如果没有其他代码更改,它们的用法是不可互换的。@JesseWebb,感谢您指出这一点。我在回答中加入了你的评论,