C#:嵌套条件vs继续语句

KP.*_*KP. 16 c# resharper continue nested-loops

在最近使用ReSharper时,它建议我通过反转if条件和使用continue语句来减少某些地方的嵌套.

嵌套条件:

foreach(....)
{
    if(SomeCondition)
    {
        //do some things

        if(SomeOtherNestedCondition)
        {
            //do some further things
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

继续陈述:

foreach(....)
{
    if(!SomeCondition) continue;

    //do some things

    if(!SomeOtherNestedCondition) continue;

    //do some further things
}
Run Code Online (Sandbox Code Playgroud)

我理解为什么你想减少嵌套的性能和内存问题以及两个片段如何相互等同的逻辑,但是从我的开发背景来看,前面的例子在阅读代码时更容易理解.

您更喜欢哪种方法?为什么?你continue在日常代码中使用嵌套ifs吗?

Jim*_*ffa 29

作为一项规则,我发现最好总是使用除了out之外的任何条件启动语句块,因为它会降低复杂性,但更重要的是在它们进一步处理之前抛出不兼容的情况,这会增加代码和内存性能.这也可以通过维护确保您的条件在一段时间内的安全性,这样就不太可能将无效的方案传递给他们不属于的代码.

另外我认为两者中的第二个更具可读性,因为你没有让范围层混淆可用的东西,很容易在后面的一层中创建变量并且没有意识到它在另一层中不可用,或者不得不管理它们以适当修改等.

这不仅仅是循环中的继续,而且这也是指应该返回的方法条件; 而不是让方法开始

if (valid)
{
    do stuff;
}
Run Code Online (Sandbox Code Playgroud)

它应该始终开始

if (notValid)
{
    return;
}
Run Code Online (Sandbox Code Playgroud)

  • +1好点.我和你在一起.我通常会把使方法返回/退出的所有条件都放在顶部.通常我首先抛出异常抛出,然后是if-return块,然后是方法逻辑. (2认同)

Mat*_*nen 8

应该没有显着的性能差异,这完全取决于可读性.我个人认为后者更容易阅读.较少嵌套,更易于阅读.


sta*_*ica 6

简短回答:

我倾向于使用缩进,这意味着发生了一些真正的决策逻辑,即.逻辑,其中预期有多个可能的执行路径.

更长的回答:

通常喜欢缩进块到前面的"断裂"语句(continue,break,return,或throw).

原因:在我看来,破坏陈述通常会使代码难以阅读.如果你缩进代码,很容易找到一些决策逻辑发生的位置:这将是缩小代码的第一行.如果您使用具有反转条件的break语句,则必须做更多工作以了解代码如何分支以及在何种情况下跳过某些代码.

对我来说有一个值得注意的例外,即在方法开头验证参数.我格式化此代码如下:

if (thisArgument == null) throw new NullArgumentException("thisArgument");
if (thatArgument < 0) throw new ArgumentOutOfRangeException("thatArgument");
...
Run Code Online (Sandbox Code Playgroud)

原因:因为我不希望实际抛出这些异常(也就是说,我希望方法被正确调用;调用函数负责检测无效输入,IMO),我不想缩进所有其余的对于不应该发生的事情的代码.