我刚刚发现了一段看起来像这样的代码;
for(;;)
{
if (condition)
{
continue;
}
DoSomething();
}
编写像这样的代码而不仅仅是这样做有什么意义;
for(;;)
{
if (!condition)
{
DoSomething();
}
}
答案 0 :(得分:2)
在您的特定情况下 - 完全没有区别,因为条件下的代码块是单方法调用。
但是,如果不满足条件时运行的代码不是对DoSomething();
的单个调用,而是一些足够大的代码块 - 那么当使用语法时,您将获得稍微更少的嵌套级别(以及稍微更易读的代码) continue
。
考虑一下:
for(;;)
{
if (condition)
continue;
DoSomething();
DoSomethingElse();
DoAnything();
....
DoAnythingElse();
}
和
for(;;)
{
if (!condition)
{
DoSomething();
DoSomethingElse();
DoAnything();
....
DoAnythingElse();
}
}
由于嵌套/缩进程度较高,第二个样本看起来不太可读。
答案 1 :(得分:2)
当你添加更多这样的"破坏条件时,可读性的可能性变得显而易见":
for(;;)
{
if (condition1)
{
continue;
}
if (condition2)
{
continue;
}
if (condition3)
{
continue;
}
DoSomething();
}
这样可以逐个检查导致迭代跳过的条件。
将其转换为替代形式:
for(;;)
{
if (!condition1 && !condition2 && !condition3)
{
DoSomething();
}
}
可以说,这比上面的可读性稍差。一旦在continue
:
for(;;)
{
if (condition1)
{
Log("condition1");
}
else
{
if (condition2)
{
Log("condition2");
}
else
{
if (condition3)
{
Log("condition3");
}
else
{
DoSomething();
}
}
}
}
VS。与continue
:
for(;;)
{
if (condition1)
{
Log("condition1");
continue;
}
if (condition2)
{
Log("condition2");
continue;
}
if (condition3)
{
Log("condition3");
continue;
}
DoSomething();
}
答案 2 :(得分:2)
这种继续使用更常与代码结构相关联:
for (; exitCondition;) {
AlwaysDoDomething();
if (condition) {
continue;
}
SometimesDoSomething();
}
IE中。循环中有两个代码块,条件仅控制第二个块。人们可能更喜欢
for (; exitCondition;) {
AlwaysDoDomething();
if (!condition) {
SometimesDoSomething();
}
}
但这假设condition
足够简单,以致否定不会在表达式中丢失(考虑condition
实际上是expression1 || expression2 || expression3
,其中子表达式本身是非不重要的)。并且SometimesDoSomething
很短,因此很明显if
控制的区块很短。
最明显的是主观和在很大程度上取决于具体情况。