否则还是回来?

Ram*_*Ram 23 .net c#

以下两个中哪一个最适合性能和标准练习..NET内部如何处理这两个代码片段?

代码1

If(result)
{
  process1();
}
else
{
  process2();
}
Run Code Online (Sandbox Code Playgroud)

或代码2

If(result)
{
   process1();
   return;
}
process2();
Run Code Online (Sandbox Code Playgroud)

Jam*_*mes 32

就个人而言,我总是喜欢尽快回来,所以我会去做类似的事情:

if (result)
{
    // do something
    return;
}

// do something if not result
Run Code Online (Sandbox Code Playgroud)

关于性能,我怀疑它们是否具有任何优势,它实际上取决于可读性和个人品味.我假设.NET会优化你的第一个代码块,如上所述.

  • 我显然赞成这个答案,至少在结果是检查的情况下.避免深度嵌套代码可以使代码更易于阅读和维护.另外我在if/else分支中看到了很多重复的代码(当然不一定). (9认同)

Guf*_*ffa 25

如果有的话,性能差异在任何正常情况下都可以忽略不计.

一种标准做法(除其他外)是试图从方法中保留一个退出点,以便讨论第一种选择.

return中间的实际实现最有可能跳转到方法的末尾,其中包含方法的堆栈帧的代码是,因此两个代码的最终可执行代码可能是相同的.

  • 我同意方法的单一退出点. (4认同)
  • 不要盲目地遵循"单一退出点"方法 - 在某些情况下,它会使代码_more_复杂化. (2认同)

ICR*_*ICR 23

我认为"单一退出点"被高估了.过于教条地坚持它会导致一些非常复杂的代码,它们应该有多个出口点,或者分成更小的方法.

我想说两者之间的选择取决于语义.

'如果某些条件为真,则执行此操作,否则执行此操作'完美映射到if-else.

if (isLoggedIn) {
    RedirectToContent();
} else {
    RedirectToLogin();
}
Run Code Online (Sandbox Code Playgroud)

'如果某些情况,那么做一些清理和拯救'更好地映射到代码2.这称为保护模式.这使得代码的主体尽可能正常,清晰,整洁,不必要的缩进.它通常用于验证参数或状态(检查某些内容是否为空,或某些内容是否已缓存,类似于此类).

if (user == null) {
    RedirectToLogin();
    return;
}

DisplayHelloMessage(user.Name);
Run Code Online (Sandbox Code Playgroud)

在同一个项目中使用这两种形式并不罕见.正如我所说,使用哪种方法取决于你要传达的内容.

  • 我的看法是,只有一个退出点并没有改变这样一个事实,即有多种方式可以传输并最终退出该功能.它们都在同一点上出现的事实本质上并不比早先在多个地方退出更好.我更喜欢提前退出,除非它是一个简单的if-else(没有嵌套)或提前退出会导致代码重复. (3认同)