Язык программирования C#9 и платформа .NET5
string[] carTypes = {"Ford", "BMW", "Yugo", "Honda" };foreach (string c in carTypes){Console.WriteLine(c);}int[] myInts = { 10, 20, 30, 40 };foreach (int i in myInts){Console.WriteLine(i);}}За ключевым словом
может быть указан простой массив (как в приведенном примере) или, точнее говоря, любой класс, реализующий интерфейсin. Как вы увидите в главе 10, библиотеки базовых классов .NET Core поставляются с несколькими коллекциями, которые содержат реализации распространенных абстрактных типов данных. Любой из них (скажем, обобщенный типIEnumerable) может применяться внутри циклаList<T>.foreachИспользование неявной типизации в конструкциях foreach
В итерационных конструкциях
также допускается использование неявной типизации. Как и можно было ожидать, компилятор будет выводить корректный "вид типа". Вспомните пример метода LINQ, представленный ранее в главе. Даже не зная точного типа данных переменнойforeach, с применением неявной типизации все-таки можно выполнять итерацию по результирующему набору. Поместите в начало файла следующий операторsubset:usingusing System.Linq;static void LinqQueryOverInts(){int[] numbers = { 10, 20, 30, 40, 1, 2, 3, 8 };// Запрос LINQ!var subset = from i in numbers where i < 10 select i;Console.Write("Values in subset: ");foreach (var i in subset){Console.Write("{0} ", i);}}Использование циклов while и do/while
Итерационная конструкция
удобна, когда блок операторов должен выполняться до тех пор, пока не будет удовлетворено некоторое условие завершения. Внутри области видимости циклаwhileнеобходимо позаботиться о том, чтобы это условие действительно удовлетворялось, иначе получится бесконечный цикл. В следующем примере сообщениеwhileбудет постоянно выводиться на консоль, пока пользователь не завершит цикл вводом"In while loop"в командной строке:yesstatic void WhileLoopExample(){string userIsDone = "";// Проверить копию строки в нижнем регистре.while(userIsDone.ToLower() != "yes"){Console.WriteLine("In while loop");Console.Write("Are you done? [yes] [no]: "); // Запрос продолженияuserIsDone = Console.ReadLine();}}С циклом
тесно связан операторwhile. Подобно простому циклуdo/whileциклwhileиспользуется, когда какое-то действие должно выполняться неопределенное количество раз. Разница в том, что циклdo/whileгарантирует, по крайней мере, однократное выполнение своего внутреннего блока кода. С другой стороны, вполне возможно, что циклdo/whileвообще не выполнит блок кода, если условие оказывается ложным с самого начала.whilestatic void DoWhileLoopExample(){string userIsDone = "";do{Console.WriteLine("In do/while loop");Console.Write("Are you done? [yes] [no]: ");userIsDone = Console.ReadLine();}while(userIsDone.ToLower() != "yes"); // Обратите внимание на точку с запятой!}Краткое обсуждение области видимости
Как и во всех языках, основанных на С (С#, Java и т.д.), область видимости создается с применением фигурных скобок. Вы уже видели это во многих примерах, приведенных до сих пор, включая пространства имен, классы и методы. Конструкции итерации и принятия решений также функционируют в области видимости, что иллюстрируется в примере ниже:
for(int i = 0; i < 4; i++){Console.WriteLine("Number is: {0} ", i);}Для таких конструкций (в предыдущем и следующем разделах) законно не использовать фигурные скобки. Другими словами, показанный далее код будет в точности таким же, как в примере выше:
for(int i = 0; i < 4; i++)Console.WriteLine("Number is: {0} ", i);Хотя фигурные скобки разрешено не указывать, обычно поступать так — не лучшая идея. Проблема не с однострочным оператором, а с оператором, который начинается в одной строке и продолжается в нескольких строках. В отсутствие фигурных скобок можно допустить ошибки при расширении кода внутри конструкций итерации или принятия решений. Скажем, приведенные ниже два примера — не одинаковы:
for(int i = 0; i < 4; i++)