Когда цикл while проверяет его состояние - PullRequest
3 голосов
/ 06 июня 2011

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

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

   // other code
}

Версия 2:

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

   // other code
}

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

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

Ответы [ 8 ]

4 голосов
/ 06 июня 2011

Версия 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 голосов
/ 06 июня 2011

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

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

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

0 голосов
/ 06 июня 2011

Если бы это было в процедуре валидации, я бы даже ОБА не использовал конструкцию WHILE () ... Раньше я обычно тестировал каждую конкретную процедуру валидации, которая выполняла именно это ... никаких циклов, таких как

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

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

    etc...

    return true;
}

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

if IsAllDataValid()
{
   Do Your Other Code
}
0 голосов
/ 06 июня 2011

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

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

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

    // other code
}
0 голосов
/ 06 июня 2011

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

0 голосов
/ 06 июня 2011

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

0 голосов
/ 06 июня 2011

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

0 голосов
/ 06 июня 2011
Цикл

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...