为什么我应该使用continue而不是空的if语句?

3
例如: 使用这个块的缺点/优点是什么:
for(int i = 0; i < 10; i++)
{
   if(i < 9){}
   else Console.Writeline(i);
}

与这个块相反:
for(int i = 0; i < 10; i++)
{
   if(i < 9)
   {
   continue;
   }
   Console.Writeline(i);
}

考虑到它们的输出完全相同。


1
彼此之间没有优劣之分。如果使用空的if语句,会使代码难以阅读(有时候)...你最好使用if(i >= 9){ ..} - SMA
顺便提一下,在你的例子中它只打印9,因为循环只到10。 - M.kazem Akhgary
也许有了解编译器如何处理 continue 关键字的人可以给一些建议。我不知道,但是 continue 可能会有一些性能优劣。 - Andre
@Andre 他们没有性能劣势,也没有优势。性能差异会非常小;) - M.kazem Akhgary
只考虑代码的可读性。请自行或与您的团队一起决定哪种方法更易读。 - Fabio
为了提高可读性,您可以使用一些不那么命令式的语句:foreach(var i in Enumerable.Range(0,11).Where(i => i >= 9)) Console.WriteLine(i); - Yuval Itzchakov
3个回答

9

空块很奇怪,所以在这种情况下,您只需反转条件:

for (int i = 0; i < 10; i++)
{
   if (i >= 9)
       Console.Writeline(i);
}

但是在一般情况下,使用continuebreak是防止您的代码缩进过多的好方法。有关此主题的讨论,请参见Programmers SE上的此问题


缩进的代码比缩进的程序更有意义。 - SimpleVar

3

我总是这样做

// ...
if(!(i < 9))
    Console.Writeline(i);
// ...

为了避免出现无用的if语句。

在您的代码中,这两种方法几乎没有区别,第一种方法会直接跳过else语句,而第二种方法会跳过循环中的其余内容。


在我看来,负面的 If 代码块比正面的难以阅读。 - Fabio
当我有一个空的if语句时,我发现只做一个not if语句通常很有用。有时我的大脑不太灵光,或者我必须添加更多的逻辑到if语句中才能使它在不使用NOT的情况下正常工作。 - Riley Carney
1
如果可以用returncontinuebreak来替代,那么将Negative替换为if (i < 9) return; - Fabio
我想这是个人观点,就我个人而言,我不喜欢放置一个“空”的if语句(除了返回/继续/中断之外什么也不做的语句)。 - Riley Carney
使用 returnbreak 时,不要留下空块。考虑以下代码:if(i<9) continue; Console.WriteLine(i.ToString()); - 只会打印大于等于9的值,而不会留下空块。 - Fabio
显示剩余2条评论

1
我发现选择一个而不是另一个的唯一原因是易读性。我个人都使用这两种形式,根据 if 后面块的长度来选择其中之一。例如,如果它只包含少量行,我就使用简单的 if
for (int i = 0; i < 10; i++)
{
   if (i >= 9)
       Console.Writeline(i);
}

(示例来自poke answer)。

但如果工作量很大,我会倒置条件,并依靠continue

for (int i = 0; i < 10; i++)
{
   if (i < 9) continue;

   Console.Writeline(i);
   Console.Writeline("this");
   Console.Writeline("that");
   Console.Writeline("blablabla");
   Console.Writeline("hello");
   Console.Writeline("world");
   Console.Writeline(i + 1);
   Console.Writeline(i + 2);
}

这样做可以避免在更大的代码块上出现缩进。在单独或很少几行上这样做通常很容易阅读,但在较长的代码块上可能会变得更难跟踪。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接