Шрифт:
Интервал:
Закладка:
На заметку! В C# поддерживается возможность динамической типизации с применением ключевого слова dynamic. Вы узнаете о таком аспекте языка в главе 18.
Взамен средство выведения типов сохраняет аспект строгой типизации языка C# и воздействует только на объявление переменных при компиляции. Затем данные трактуются, как если бы они были объявлены с выведенным типом; присваивание такой переменной значения другого типа будет приводить к ошибке на этапе компиляции.
static void ImplicitTypingIsStrongTyping()
{
// Компилятору известно, что s имеет тип System.String.
var s = "This variable can only hold string data!";
s = "This is fine...";
// Можно обращаться к любому члену лежащего в основе типа.
string upper = s.ToUpper();
// Ошибка! Присваивание числовых данных строке не допускается!
s = 44;
}
Полезность неявно типизированных локальных переменных
Теперь, когда вы видели синтаксис, используемый для объявления неявно типизируемых локальных переменных, вас наверняка интересует, в каких ситуациях его следует применять. Прежде всего, использование var для объявления локальных переменных просто ради интереса особой пользы не принесет. Такой подход может вызвать путаницу у тех, кто будет изучать код, поскольку лишает возможности быстро определить лежащий в основе тип данных и, следовательно, затрудняет понимание общего назначения переменной. Поэтому если вы знаете, что переменная должна относиться к типу int, то сразу и объявляйте ее с типом int!
Однако, как будет показано в начале главы 13, в наборе технологий LINQ применяются выражения запросов, которые могут выдавать динамически создаваемые результирующие наборы, основанные на формате самого запроса. В таких случаях неявная типизация исключительно удобна, потому что вам не придется явно определять тип, который запрос может возвращать, а в ряде ситуаций это вообще невозможно. Посмотрите, сможете ли вы определить лежащий в основе тип данных subset в следующем примере кода 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);
}
Console.WriteLine();
// К какому же типу относится subset?
Console.WriteLine("subset is a: {0}", subset.GetType().Name);
Console.WriteLine("subset is defined in: {0}",
subset.GetType().Namespace);
}
Вы можете предположить, что типом данных subset будет массив целочисленных значений. Но на самом деле он представляет собой низкоуровневый тип данных LINQ, о котором вы вряд ли что-то знаете, если только не работаете с LINQ длительное время или не откроете скомпилированный образ в утилите ildasm.exe. Хорошая новость в том, что при использовании LINQ вы редко (если вообще когда-либо) беспокоитесь о типе возвращаемого значения запроса; вы просто присваиваете значение неявно типизированной локальной переменной.
Фактически можно было бы даже утверждать, что единственным случаем, когда применение ключевого слова var полностью оправдано, является определение данных, возвращаемых из запроса LINQ. Запомните, если вы знаете, что нужна переменная int, то просто объявляйте ее с типом int! Злоупотребление неявной типизацией в производственном коде (через ключевое слово var) большинство разработчиков расценивают как плохой стиль кодирования.
Работа с итерационными конструкциями C#
Все языки программирования предлагают средства для повторения блоков кода до тех пор, пока не будет удовлетворено условие завершения. С каким бы языком вы не имели дело в прошлом, итерационные операторы C# не должны вызывать особого удивления или требовать лишь небольшого объяснения. В C# предоставляются четыре итерационные конструкции:
• цикл for;
• цикл foreach/in;
• цикл while;
• цикл do/while.
Давайте рассмотрим каждую конструкцию зацикливания по очереди, создав новый проект консольного приложения по имени IterationsAndDecisions.
На заметку! Материал данного раздела главы будет кратким и по существу, т.к. здесь предполагается наличие у вас опыта работы с аналогичными ключевыми словами (if, for, switch и т.д.) в другом языке программирования. Если нужна дополнительная информация, просмотрите темы "Iteration Statements (C# Reference)" ("Операторы итераций (справочник по С#)"), "Jump Statements (C# Reference)" ("Операторы перехода (справочник по С#)") и "Selection Statements (C# Reference)" ("Операторы выбора (справочник по С#)") в документации по C# (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
Ключевое слово foreach языка C# позволяет проходить в цикле по всем элементам внутри контейнера без необходимости в проверке верхнего предела. Тем не менее, в отличие от цикла for цикл foreach будет выполнять проход по контейнеру только линейным (п+1) образом (т.е. не получится проходить по контейнеру в обратном направлении, пропускать каждый третий элемент и т.п.).
Однако если нужно просто выполнить проход по коллекции элемент за элементом, то цикл foreach будет великолепным выбором. Ниже приведены два примера использования цикла foreach — один для обхода массива строк и еще один для обхода массива целых чисел. Обратите внимание,
- QT 4: программирование GUI на С++ - Жасмин Бланшет - Программирование
- C# для профессионалов. Том II - Симон Робинсон - Программирование
- C# 4.0: полное руководство - Герберт Шилдт - Программирование
- Программирование игр и головоломок - Жак Арсак - Программирование
- Microsoft Visual C++ и MFC. Программирование для Windows 95 и Windows NT. Часть 2 - Александр Фролов - Программирование
- Графические интерфейсы пользователя Java - Тимур Сергеевич Машнин - Программирование
- Гибкое управление проектами и продуктами - Борис Вольфсон - Программирование
- Каждому проекту своя методология - Алистэр Коуберн - Программирование
- От «Энигмы» до ChatGPT - Рустам Агамалиев - Программирование / Экономика
- Как почистить сканы книг и сделать книгу - IvanStorogev? KpNemo - Программирование