Язык программирования C#9 и платформа .NET5
Однако, как будет показано в начале главы 13, в наборе технологий LINQ применяются выражения запросов, которые могут выдавать динамически создаваемые результирующие наборы, основанные на формате самого запроса. В таких случаях неявная типизация исключительно удобна, потому что вам не придется явно определять тип, который запрос может возвращать, а в ряде ситуаций это вообще невозможно. Посмотрите, сможете ли вы определить лежащий в основе тип данных
в следующем примере кода LINQ?subsetstatic void LinqQueryOverInts(){int[] numbers = { 10, 20, 30, 40, 1, 2, 3, 8 };<b>// Запрос LINQ!</b>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);}Console.WriteLine();// К какому же типу относится subset?Console.WriteLine("subset is a: {0}", subset.GetType().Name);Console.WriteLine("subset is defined in: {0}",subset.GetType().Namespace);}Вы можете предположить, что типом данных
будет массив целочисленных значений. Но на самом деле он представляет собой низкоуровневый тип данных LINQ, о котором вы вряд ли что-то знаете, если только не работаете с LINQ длительное время или не откроете скомпилированный образ в утилитеsubset. Хорошая новость в том, что при использовании LINQ вы редко (если вообще когда-либо) беспокоитесь о типе возвращаемого значения запроса; вы просто присваиваете значение неявно типизированной локальной переменной.ildasm.exeФактически можно было бы даже утверждать, что единственным случаем, когда применение ключевого слова
полностью оправдано, является определение данных, возвращаемых из запроса LINQ. Запомните, если вы знаете, что нужна переменнаяvar, то просто объявляйте ее с типомint! Злоупотребление неявной типизацией в производственном коде (через ключевое словоint) большинство разработчиков расценивают как плохой стиль кодирования.varРабота с итерационными конструкциями C#
Все языки программирования предлагают средства для повторения блоков кода до тех пор, пока не будет удовлетворено условие завершения. С каким бы языком вы не имели дело в прошлом, итерационные операторы C# не должны вызывать особого удивления или требовать лишь небольшого объяснения. В C# предоставляются четыре итерационные конструкции:
• цикл
;for• цикл
;foreach/in• цикл
;while• цикл
.do/whileДавайте рассмотрим каждую конструкцию зацикливания по очереди, создав новый проект консольного приложения по имени
.IterationsAndDecisionsНа заметку! Материал данного раздела главы будет кратким и по существу, т.к. здесь предполагается наличие у вас опыта работы с аналогичными ключевыми словами (
,if,forи т.д.) в другом языке программирования. Если нужна дополнительная информация, просмотрите темы "Iteration Statements (C# Reference)" ("Операторы итераций (справочник по С#)"), "Jump Statements (C# Reference)" ("Операторы перехода (справочник по С#)") и "Selection Statements (C# Reference)" ("Операторы выбора (справочник по С#)") в документации по C# (switch).https://docs.microsoft.com/ru-ru/dotnet/csharp/Использование цикла for
Когда требуется повторять блок кода фиксированное количество раз, хороший уровень гибкости предлагает оператор
. В действительности вы имеете возможность указывать, сколько раз должен повторяться блок кода, а также задавать условие завершения. Не вдаваясь в излишние подробности, ниже представлен пример синтаксиса:for// Базовый цикл for.static void ForLoopExample(){// Обратите внимание, что переменная i видима только в контексте цикла for.for(int i = 0; i < 4; i++){Console.WriteLine("Number is: {0} ", i);}// Здесь переменная i больше видимой не будет.}Все трюки, которые вы научились делать в языках С, C++ и Java, по-прежнему могут использоваться при формировании операторов
в С#. Допускается создавать сложные условия завершения, строить бесконечные циклы и циклы в обратном направлении (посредством операцииfor), а также применять ключевые слова--,gotoиcontinue.breakИспользование цикла foreach
Ключевое слово
языка C# позволяет проходить в цикле по всем элементам внутри контейнера без необходимости в проверке верхнего предела. Тем не менее, в отличие от циклаforeachциклforбудет выполнять проход по контейнеру только линейным (п+1) образом (т.е. не получится проходить по контейнеру в обратном направлении, пропускать каждый третий элемент и т.п.).foreachОднако если нужно просто выполнить проход по коллекции элемент за элементом, то цикл
будет великолепным выбором. Ниже приведены два примера использования циклаforeach— один для обхода массива строк и еще один для обхода массива целых чисел. Обратите внимание, что тип, указанный перед ключевым словомforeach, представляет тип данных контейнера.in// Проход по элементам массива посредством foreach.static void ForEachLoopExample(){