在许多条件下编写return语句的正确方法

时间:2014-02-26 13:08:07

标签: c# coding-style return

我想知道是否有一种很好的编码方式:

return IOTools.CreateFile(@"D:\test")
    && IOTools.CreateDir(@"D:\test_folder\")
    && IOTools.DeleteFile(@"D:\test_file_2")
    && IOTools.DeleteDir(@"D:\test_folder_2\");

我知道我可以将其全部放在其他函数中并且使用if语句在每个条件之后返回false,但是如果一个是假的话,可能还有另一种方法可以阻止程序尝试执行下一个条件?

3 个答案:

答案 0 :(得分:4)

&&已经是short-circuiting运营商。因此,只要一个条件为false,它就会停止。

  

如果x为假,则不评估y,因为AND的结果   无论y的值是什么,操作都是假的。这被称为   “短路”评估。

顺便说一下,只要一个条件为||true也会停止评估。

如果您要求更易读的方法,可以使用变量:

bool canCreateFile = IOTools.CreateFile(@"D:\test");
bool canCreateDir = IOTools.CreateDir(@"D:\test_folder\");
bool canDeleteFile = IOTools.DeleteFile(@"D:\test_file_2");
bool canDeleteDir = IOTools.DeleteDir(@"D:\test_folder_2\");

return canCreateFile && canCreateDir && canDeleteFile  && canDeleteDir; 

如果代码变得过于复杂,我会使用变量来提高可读性,可维护性和可测试性。

答案 1 :(得分:0)

这和你一样干净。引入其他任何东西都可能会增加而不是降低复杂性。

答案 2 :(得分:0)

一些非常重要的指导原则:

  • 如果您使用“&&”并且某些东西返回false,其余的'if'将不会被执行。这可能是愿望,也可能不是。在您的情况下,如果任何创建目录/删除失败,则其余部分将不会被执行。
  • 您需要考虑代码的可维护性。检查带有副作用的一系列条件的布尔语句以后很难编辑,因为进行更改的程序员可能不会意识到这些副作用。

希望这有点帮助。

更多详情

编辑困难的一个例子。让我们说另一个程序员想要为你的程序添加一个新的创建。现在该计划是:

return IOTools.CreateFile(someNewFile)
    && IOTools.CreateFile(@"D:\test")
    && IOTools.CreateDir(@"D:\test_folder\")
    && IOTools.DeleteFile(@"D:\test_file_2")
    && IOTools.DeleteDir(@"D:\test_folder_2\");

但新程序员犯了一个错误,该文件恰好永远不会被创建。他们按照你的模式 - 实际上破坏了你的代码。这突然是一个严重的问题!一个更好的模式是:

var overallSuccess = false;
overallSuccess |= IOTools.CreateFile(someNewFile);
overallSuccess |= IOTools.CreateFile(@"D:\test");
overallSuccess |= IOTools.CreateDir(@"D:\test_folder\");
overallSuccess |= IOTools.DeleteFile(@"D:\test_file_2");
overallSuccess |= IOTools.DeleteDir(@"D:\test_folder_2\");
return overallSuccess;

现在所有语句都会运行,返回值表示ANY create是否成功。如果所有语句都成功,您可以将“| =”更改为“& =”以获得真正的返回。祝你好运!