关于c#:在许多条件下编写return语句的正确方法

Proper way of coding return statement with many conditions

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

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

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


&&已经是一个短路运算符。所以只要有一个条件是false,它就会停止。

if x is false, y is not evaluated, because the result of the AND
operation is false no matter what the value of y is. This is known as
"short-circuit" evaluation.

顺便说一句,只要有一个条件是true||也会停止评估。

如果你要求一种更易读的方式,你可以使用变量:

1
2
3
4
5
6
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;

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


一些非常重要的指导方针:

  • 如果您使用"&;&;"并且某些返回错误,则不会执行其余的"if"。这可能是愿望,也可能不是。在您的情况下,如果任何create directory/delete失败,其余的将不会被执行。
  • 您需要考虑代码的可维护性。检查一系列有副作用的条件的布尔语句以后可能很难编辑,因为进行更改的程序员可能不知道这些副作用。

希望这能有所帮助。

更多细节

编辑困难的例子。假设另一个程序员想要向您的程序添加一个新的创建。现在的计划是:

1
2
3
4
5
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");

但是新的程序员犯了一个错误,这个文件碰巧永远不会被创建。它们遵循了你的模式——实际上破坏了你的代码。突然之间这是一个严重的问题!更好的模式是:

1
2
3
4
5
6
7
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;

现在所有语句都运行,返回值表示任何创建是否成功。如果所有语句都成功,则可以将"="更改为"&;="以获得真正的返回。祝你好运!


这是你能得到的最干净的。引入任何其他东西都可能增加而不是减少复杂性。