#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 (), я не хотел вдаваться в более сложный ответ о том, как я на самом деле использую события для тестирования и предоставляю визуальную обратную связь и / или сообщение обо ВСЕХ результатах проверки, как вы прокомментируете.