C# Do While循环的可接受用法?

C# Do While循环的可接受用法?,c#,java,c++,c,do-while,C#,Java,C++,C,Do While,可能重复: 我不经常使用Do While循环,但我发现自己在一个特定类别的案例中使用了Do While循环,我想通过多个退出点完成一系列事情,但只执行一次。我总是用“while(TRUE)”作为条件,在循环的最后用“if(TRUE)break;”,因为我只想经历一次。[我想我也可以把这两个组合成一个“while(FALSE)。” 我只在这些情况下使用了Do-While构造,但我不确定这是一种“可接受的”使用方法,还是有更好的方法。谢谢。在上述情况下,你为什么还要这样做?不过,做下面的事情取决于

可能重复:

我不经常使用Do While循环,但我发现自己在一个特定类别的案例中使用了Do While循环,我想通过多个退出点完成一系列事情,但只执行一次。我总是用“while(TRUE)”作为条件,在循环的最后用“if(TRUE)break;”,因为我只想经历一次。[我想我也可以把这两个组合成一个“while(FALSE)。”


我只在这些情况下使用了Do-While构造,但我不确定这是一种“可接受的”使用方法,还是有更好的方法。谢谢。

在上述情况下,你为什么还要这样做?不过,做下面的事情取决于你在做什么

 if (!CheckCondition1) return;
 // do some stuff

 if (!CheckCondition2) return;
 // do some stuff

在上述情况下,你为什么还要这样做?不过,做下面的事情取决于你在做什么

 if (!CheckCondition1) return;
 // do some stuff

 if (!CheckCondition2) return;
 // do some stuff

我发现
do
的这种用法非常令人困惑和难看。至少在C语言中,
for(;;)
是无限循环的标准用法。看到
do
让我对组织有了期待,虽然
中的条件很重要,但却发现
是真的(这也是一种糟糕的风格)…

我发现
do
的这种用法非常混乱和丑陋。至少在C语言中,
for(;;)
是无限循环的标准用法。看到
do
让我对组织产生了一些期待,而
中的条件将非常重要,结果却发现
是真的
(这也是不好的风格)还有…

我所知道的另一种方法是将代码放入函数中,并使用
返回
而不是
中断

然而,这也有其自身的缺点:无法访问局部变量,创建本不应该存在的函数会带来额外的复杂性,一些编码标准可能会强制您使用“单一退出点”


所以,
do{…}while(false)
看起来好多了,只不过是一个蒙面的
goto
。不要忘记,
goto
被禁止是为了避免spagetti代码,并且已经证明标准的C控制流结构足以描述任何流。好的,您刚刚做到了。

我知道的另一种方法是将代码放入函数中,并使用
返回
而不是
中断

然而,这也有其自身的缺点:无法访问局部变量,创建本不应该存在的函数会带来额外的复杂性,一些编码标准可能会强制您使用“单一退出点”


所以,
do{…}while(false)
看起来好多了,只不过是一个蒙面的
goto
。不要忘记,
goto
被禁止是为了避免spagetti代码,并且已经证明标准的C控制流结构足以描述任何流。好的,你刚刚做到了。

我发现了这个
do{}while()的用法相当可接受。假设您应该在(0)
时放置
(现在您还可以使用
继续
)。因为如果你没有破译的话循环仍将终止。
有趣的是,我在上一家公司的生产代码中看到过这样的用法,这是经过专家审查的

人们可能会想到使用
返回
。但这种方法的问题是析构函数。考虑下面的场景:

void fun ()
{
  CLASS_a a1, a2, a3, a4;
  CLASS_b b1, b2, b3, b4;

  ...
  return 1;
  ...
  return 2;
  ...
  return 3;
  ...
  return 4;
}
在每个return语句中,将放置上述所有对象的析构函数代码。这有时可能会在不知不觉中增加代码大小。此外,我发现更好的做法是减少退出点,这使得代码更易于调试


Edit:放置
continue
而不是
break
是一个更好的主意,因为
break
将不允许在
switch()
语句中退出循环。

我发现了这个
do{}while()的用法相当可接受。假设您应该在(0)
时放置
(现在您还可以使用
继续
)。因为如果你没有破译的话循环仍将终止。
有趣的是,我在上一家公司的生产代码中看到过这样的用法,这是经过专家审查的

人们可能会想到使用
返回
。但这种方法的问题是析构函数。考虑下面的场景:

void fun ()
{
  CLASS_a a1, a2, a3, a4;
  CLASS_b b1, b2, b3, b4;

  ...
  return 1;
  ...
  return 2;
  ...
  return 3;
  ...
  return 4;
}
在每个return语句中,将放置上述所有对象的析构函数代码。这有时可能会在不知不觉中增加代码大小。此外,我发现更好的做法是减少退出点,这使得代码更易于调试

Edit:放置
continue
而不是
break
是一个更好的主意,因为
break
将不允许在
switch()
语句中退出循环。

do{…}while(false);它通常用于处理c语言中的错误,例如:

int some_func(void)
{
    do {
        /* alloc some heap resources */

        /* do something */

        if (something goes wrong) break; /* error handling */

        /* do other things */

        return SUCCESS; 
    } while (false);

    /* release resources */

    return FAILURE;
}
< C++ >,最好使用<代码>尝试{…} catch(…)<代码> >

do{} }(false);它通常用于处理c语言中的错误,例如:

int some_func(void)
{
    do {
        /* alloc some heap resources */

        /* do something */

        if (something goes wrong) break; /* error handling */

        /* do other things */

        return SUCCESS; 
    } while (false);

    /* release resources */

    return FAILURE;
}
<>在C++中,你最好使用<代码> Test{{}} catch(…)<代码>。C(和C++中如果你避免异常),最好使用<代码> Goto < /C>。现在,不要用goto替换所有结构化的
while
循环,但是当你有了这种模式来检查一系列不同的错误条件,并从失败中清除时,
goto
是最有保证的,它是表达你试图实现的目标的最清晰的方式之一

(规范列表位于)

此模式有多种变化,具体取决于您需要清理的内容:

  • 当清理是相同的,无论f在哪里