Ватсон Карли
Шрифт:
while и do…while
Также, как и для
if
, эти инструкции имеют точно такой же синтаксис и назначение в C#, как и в C++, за исключением того, что условное выражение должно оцениваться как bool
. int X;
while (X) {/* инструкции */} // неправильно
while (X != 0) {/* инструкции */} // правильно
switch
Инструкция
switch
служит для тех же целей в C#, что и в C++. Она является, однако, более мощной в C#, так как используется строка в качестве проверяемой переменной, что невозможно в C++: string MyString; // инициализировать MyString
switch (MyString) {
case "Hello":
// что-нибудь сделать
break;
case "Goodbye":
// и т.д.
Синтаксис в C# слегка отличается тем, что каждое предложение
case
должно явно заканчиваться. Не разрешается одному case
содержать другой case
, если только первый case
не является пустым. Если желательно получить такой результат, используйте инструкцию goto
. switch (MyString) {
case "Hello":
// что-нибудь сделать
goto case "Goodbye"; // перейдет к выполнению инструкций
// в предложении "Goodbye"
case "Goodbye":
// сделать что-то еще
break;
case "Black": // здесь можно провалиться, так как он пустой
case "White":
// сделать что-то еще
// выполняется, если MyString содержит
// либо "Black", либо "White"
break;
default:
int j = 3;
break;
}
Компания Microsoft решила использовать инструкцию
goto
в этом контексте, чтобы предотвратить появление ошибок в случае, если требовалось выполнить пропущенный break
, и код в инструкции switch
проваливался в следующее предложение case
. foreach
C# предоставляет дополнительную инструкцию управления потоком выполнения
foreach
. foreach
делает цикл по всем элементам массива или коллекции, не требуя явной спецификации индексов. Цикл foreach
на массиве может выглядеть следующим образом. В этом примере предполагается, что MyArray
является массивом double
, и необходимо вывести каждое значение в консольном окне. Чтобы сделать это, используем следующий код: foreach (double SomeElement in MyArray) {
Console.WriteLine(SomeElement);
}
Отметим что в этом цикле
SomeElement
является именем, присвоенным переменной для итерации по циклу; здесь можно выбрать любое имя не конфликтующее с другими именами переменных. Запишем также приведенный выше цикл следующим образом:
foreach (double SomeElement in MyArray)
Console.WriteLine(SomeElement);
так как блочные инструкции в C# работают таким же образом, как составные инструкции в C++.
Этот цикл будет иметь точно такой же результат, как и следующий:
for (int I=0; I < MyArray.Length; I++) {
Console.WriteLine(MyArray[i]);
}
(Отметим, что вторая версия иллюстрирует также, как получить число элементов в массиве в C#. Мы рассмотрим, как массив объявляется в C#, позже.)
Отметим, однако, что в отличие от доступа к элементам массива, цикл
foreach
предоставляет к своим элементам доступ только для чтения. Следовательно, следующий код не будет компилироваться. foreach (double SomeElement in MyArray)
SomeElement *= 2; // Неверно, для SomeElement нельзя выполнить
// присваивание
Мы упомянули, что цикл
foreach
может использоваться для массивов или коллекций. Коллекция не имеет аналога в C++, хотя концепция стала общераспространённой в Windows благодаря ее использованию в VB и COM. Коллекция по сути является классом, который реализует интерфейс IEnumerable
. Так как это включает поддержку из базовых классов, понятие коллекция объясняется в главе 7.