while循环何时检查其条件

时间:2011-06-06 10:36:39

标签: c# while-loop

嗨,我有类似的东西: 版本1:

bool noErrors = true;
while(noErrors)
{
   noErrors = ValidateControl(txtName);

   // other code
}

第2版:

bool noErrors = true;
while(noErrors)
{
   if(!ValidateControl(txtName)) break;

   // other code
}

我使用此代码验证表单,如果验证返回false,我想在执行“其他代码”之前中断。由于我不知道循环何时检查其状况,我不知道哪个更有意义。我应该使用第一个还是第二个版本,还是第三个版本?

感谢您的时间

8 个答案:

答案 0 :(得分:4)

版本2将在运行//other code之前中断。在下一次迭代开始之前,版本1不会检查。

bool noErrors = true;
while(noErrors) 
{    
    noErrors = ValidateControl(txtName);     
    // other code 
}

每次迭代前检查。

bool noErrors = true;
do 
{    
    noErrors = ValidateControl(txtName);     
    // other code 
} while(noErrors);

每次迭代后检查。

在迭代期间都不检查。正如其他回答者所说,以下代码简化了示例,但让我问一个问题,txtName的有效性是否可能在循环执行期间发生变化?其他一些限制条件会更有用吗?

while (ValidateControl(txtName)) 
{
    // other code 
} 

如果txtName的有效性不会改变,请考虑

if (ValidateControl(txtName))
{
  while(/*Some other condition*/)
  {
      // other code
  }
}

答案 1 :(得分:2)

只有在任何可能的迭代开始时才检查条件。因此,在版本1中,即使noErrors在正文的第一行中设置为false,也会执行“其他代码” ...而在版本2中则不会。 ..但是noErrors在版本2中看起来有些无用。

可以将其更改为:

while (ValidateControl(txtName))
{
    // other code
}

答案 2 :(得分:0)

while循环在第一次迭代之前评估其条件,并且 in between 每次后续迭代。永远不会在循环体内评估条件。

答案 3 :(得分:0)

它在再次运行之前检查它(第一次,在第一次运行之后,依此类推)。你必须打破或整个代码块才会运行。

答案 4 :(得分:0)

while循环在迭代它之前的代码块之前检查条件。您还可以使用do-while构造在最后检查条件。你的版本#2将产生你想要的结果。

答案 5 :(得分:0)

while循环在执行整个代码块之前检查条件。如果要在执行other code之前中断执行,请使用版本2.

答案 6 :(得分:0)

循环条件仅在每个循环开始时进行评估,因此在第一个版本中,即使ValidateControl返回false,“其他代码”仍将被执行。

如果ValidateControl返回false,那么第二个版本的效果会更好,并且不会运行“其他代码”,但是如果验证它也不会将noErrors设置为false失败。如果这不重要,并且noErrors只是循环条件,那么您也可以将while循环更改为while(true),如果 稍后在代码中使用,则你需要稍微改变版本2:

bool noErrors = true;
while(noErrors)
{
    if(!ValidateControl(txtName))
    {
        noErrors = false;
        break;
    }

    // other code
}

答案 7 :(得分:0)

如果这是在一个验证例程中,我甚至不会使用WHILE()构造...在过去,我通常会测试每个特定的验证例程,这样做就是......没有涉及到的循环,例如

Function bool IsAllDataValid()
{
    if ( ! (ValidateControl(txtName) )
        return false;

    if ( ! (ValidateControl(OtherField ))
        return false;

    etc...

    return true;
}

然后你不必担心混合包含在哪里或绕过某些代码块......你可能只是......

if IsAllDataValid()
{
   Do Your Other Code
}