Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么时候是;试一试;应该在C#方法名称中使用吗?_C#_Naming Conventions - Fatal编程技术网

什么时候是;试一试;应该在C#方法名称中使用吗?

什么时候是;试一试;应该在C#方法名称中使用吗?,c#,naming-conventions,C#,Naming Conventions,我们正在与同事讨论如果方法名称以“Try”开头意味着什么 有以下意见: 当方法可以返回空值时,请使用“Try” 当方法不会引发异常时,请使用“Try” 官方的定义是什么?“Try”在方法名称中表示什么有关于这方面的官方指南吗?(更正)正如埃里克所建议的,有官方指南 当我看到TrySomething方法时,我假设 不扔 返回bool 如果我期望值,则通过“out”参数返回 存在一种方法,允许我自己处理任何异常。(编辑,杰西·韦伯建议) 当您想要表明方法调用可能产生无效结果的事实时,必须在方法

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

有以下意见:

  • 当方法可以返回空值时,请使用“Try”
  • 当方法不会引发异常时,请使用“Try”
官方的定义是什么?“Try”在方法名称中表示什么有关于这方面的官方指南吗?

(更正)正如埃里克所建议的,有官方指南

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

  • 不扔
  • 返回
    bool
  • 如果我期望值,则通过“out”参数返回
  • 存在一种
    方法,允许我自己处理任何异常。(编辑,杰西·韦伯建议)
当您想要表明方法调用可能产生无效结果的事实时,必须在方法名称中使用“Try”。在.NET标准之后,顺便说一句,它不是一个引发异常的函数,而是一个从程序角度返回一些
有效
无效
值的函数


最后,这些都是关于您决定在组中使用的命名约定。

这被称为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,感谢您指出这一点。我在回答中加入了你的评论,