Когда цикл while проверяет свое состояние

#c# #while-loop

#c# #цикл while

Вопрос:

Привет, у меня есть что-то вроде: Версия 1:

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

   // other code
}
  

Версия 2:

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

   // other code
}
  

Я использую этот код для проверки формы, и если проверка возвращает false, я хочу прерваться перед выполнением «другого кода». Поскольку я не знаю, когда цикл проверяет свое состояние, я не знаю, что имеет больше смысла. Должен ли я использовать первую или вторую версию, или, может быть, третью?

Спасибо, что уделили время

Ответ №1:

Версия 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
  }
}
  

Ответ №2:

Условие проверяется только в начале любой возможной итерации. Таким образом, в версии 1 «другой код» будет выполняться, даже если noErrors в первой строке тела было установлено значение false… тогда как в версии 2 этого не было бы… но noErrors похоже, что это несколько бесполезно в версии 2.

Не могли бы вы изменить его на:

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

?

Ответ №3:

while Цикл оценивает свое условие перед первой итерацией и между каждой последующей итерацией. Условие никогда не вычисляется внутри тела цикла.

Ответ №4:

Он проверяет его перед повторным запуском (в первый раз, после первого запуска и так далее). Вы должны прерваться, иначе будет запущен весь фрагмент кода.

Ответ №5:

Цикл while проверяет условие перед выполнением итерации по блоку кода, которому он предшествует. Вы также можете заставить его проверять условие в конце, используя do-while конструкцию. Ваша версия # 2 выдаст желаемый результат.

Ответ №6:

while Цикл проверяет условие перед выполнением всего блока кода. Если вы хотите прервать выполнение до того, как other code будет выполнено, используйте версию 2.

Ответ №7:

Условие цикла вычисляется только в начале каждого цикла, поэтому в вашей первой версии «другой код» все равно будет выполняться, даже если ValidateControl возвращает false .

Ваша вторая версия работает лучше и не будет запускать «другой код», если ValidateControl возвращает false , однако она также не устанавливает noErrors значение false в случае сбоя проверки. Если это не важно, и noErrors это всего лишь условие цикла, то вы также можете изменить свой цикл while на while(true) , если он будет использоваться позже в коде, тогда вам нужно будет немного изменить версию 2:

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

    // other code
}
  

Ответ №8:

Если это входит в процедуру проверки, я бы даже не стал ЗАМОРАЧИВАТЬСЯ с конструкцией WHILE()… В прошлом я обычно тестировал каждую конкретную процедуру проверки, которая выполняла именно это … без зацикливания, такого как

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

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

    etc...

    return true;
}
  

Тогда вам не нужно беспокоиться о том, где сочетание включает или обходит определенные блоки кода… Вы могли бы просто иметь…

 if IsAllDataValid()
{
   Do Your Other Code
}
  

Комментарии:

1. Ты прав, ДРапп. Спасибо. Фактически, в моем реальном коде это именно то, что я делаю. Тем не менее, я задал вопрос, чтобы узнать, как работает цикл while и его условие.

2. Потенциальная проблема с этим заключается в том, что ему может быть интересно узнать все вещи, которые завершились неудачей, а не только первую.

3. @DBM, правильно, но как основной вопрос WHILE (), я не хотел вдаваться в более сложный ответ о том, как я на самом деле использую события для тестирования и предоставляю визуальную обратную связь и / или сообщение обо ВСЕХ результатах проверки, как вы прокомментируете.