автордың кітабын онлайн тегін оқу C# 8 и .NET Core. Разработка и оптимизация
Научный редактор М. Сагалович
Переводчик
Технические редакторы Г. Синякина (Маклакова), Н. Хлебина
Литературный редактор Н. Хлебина
Художники Н. Гринчик, В. Мостипан
Корректоры О. Андриевич, Н. Гринчик, Е. Павлович
Верстка Г. Блинов
Марк Прайс
C# 8 и .NET Core. Разработка и оптимизация. — СПб.: Питер, 2021.
ISBN 978-5-4461-1700-0
© ООО Издательство "Питер", 2021
Все права защищены. Никакая часть данной книги не может быть воспроизведена в какой бы то ни было форме без письменного разрешения владельцев авторских прав.
Об авторе
Марк Дж. Прайс — обладатель сертификатов Microsoft Certified Trainer (MCT), Microsoft Specialist: Programming in C# и Microsoft Specialist: Architecting Microsoft Azure Infrastructure Solutions. За его плечами более 20 лет практики в области обучения и программирования.
С 1993 года Марк сдал свыше 80 экзаменов корпорации Microsoft по программированию и специализируется на подготовке других людей к успешному прохождению тестирования. Его студенты — как 16-летние новички, так и профессионалы с многолетним опытом. Марк ведет эффективные тренинги, делясь реальным опытом консультирования и разработки систем для корпораций по всему миру.
В период с 2001 по 2003 год Марк посвящал все свое время разработке официального обучающего программного обеспечения в штаб-квартире Microsoft в американском городе Редмонд. В составе команды он написал первый обучающий курс по C#, когда была только выпущена ранняя альфа-версия языка. Во время сотрудничества с Microsoft он преподавал на курсах повышения квалификации сертифицированных корпорацией специалистов, читая лекции по C# и .NET.
В настоящее время Марк разрабатывает и поддерживает обучающие курсы для системы Digital Experience Platform компании Episerver, лучшей .NET CMS в сфере цифрового маркетинга и электронной коммерции.
В 2010 году Марк получил свидетельство об окончании последипломной программы обучения, дающее право на преподавание. Он преподает старшеклассникам математику в двух средних школах в Лондоне. Кроме того, Марк получил сертификат Computer Science BSc. Hons. Degree в Бристольском университете (Англия).
Спасибо моим родителям, Памеле и Иану, за мое воспитание, за то, что привили мне трудолюбие и любопытство к миру. Спасибо моим сестрам, Эмили и Джульетте, за то, что полюбили меня, неуклюжего старшего братца. Спасибо моим друзьям и коллегам, которые вдохновляют меня технически и творчески. Наконец, спасибо всем, кого я учил на протяжении многих лет, за то, что побудили меня быть лучшим преподавателем, чем я есть.
О научном редакторе
Дамир Арх — профессионал с многолетним опытом разработки и сопровождения различного программного обеспечения: от сложных корпоративных программных проектов до современных потребительских мобильных приложений. Он работал со многими языками, однако его любимым остается C#. Стремясь к совершенствованию процессов, Дамир предпочитает разработку, основанную на тестировании, непрерывной интеграции и непрерывном развертывании. Он делится своими знаниями, выступая на конференциях, ведет блоги и пишет статьи. Дамир Арх семь раз подряд получал престижную премию Microsoft MVP за разработку технологий. В свободное время он всегда в движении: любит пеший туризм, геокэшинг, бег и скалолазание.
Я хотел бы поблагодарить мою семью и друзей за огромную помощь в создании этой книги, за их терпение и понимание в выходные дни и вечера, которые я провел, работая за компьютером.
Предисловие
В книжном магазине вы увидите книги о языке C# объемом в тысячи страниц, которые содержат исчерпывающий материал по платформе .NET Framework и программированию на C#.
Эта книга другая. Она наполнена практическими руководствами по каждой теме. Данная книга одновременно представляет собой пошаговое руководство по изучению современных проверенных практик на языке C# с использованием кросс-платформенного .NET и краткое введение в основные типы приложений, которые можно создавать с их помощью. Издание лучше всего подходит новичкам в C# и .NET или программистам, которые уже ранее работали с C#, но желают совершенствоваться. Если вы уже имеете опыт работы с C# 5.0 или более поздней версией, то в первом разделе главы 2, касающейся C#, можете ознакомиться со сравнительными таблицами новых языковых функций и перейти к ним. Если уже имеете опыт работы с .NET Core 1.0 или более поздней версией, то в первом разделе главы 7 можете ознакомиться с таблицами функций новой платформы и сразу перейти к ним.
Я расскажу о крутых фишках и секретах языка C#, чтобы вы могли впечатлить коллег и потенциальных работодателей и быстро начать зарабатывать деньги. Вместо того чтобы нудно обсуждать каждую деталь, я буду пользоваться принципом «Не знаете термин — лезьте в Google».
Файлы примеров для выполнения упражнений из данной книги вы можете бесплатно скачать со страницы репозитория GitHub (github.com/markjprice/cs8dotnetcore3). Инструкции о том, как это сделать, я предоставлю в конце главы 1.
Структура книги
Глава 1 «Привет, C#! Здравствуй, .NET Core!» посвящена настройке среды разработки и использованию Visual Studio Code для разработки простейшего приложения с помощью языка C# и .NET. Вы узнаете, как писать и компилировать код в любой из операционных систем: Windows, macOS и Linux. Вдобавок вы найдете сведения о том, где лучше всего искать справочную информацию.
Глава 2 «Говорим на языке C#» знакомит нас с языком C#, его грамматикой и лексикой, которыми вы будете пользоваться каждый день, набирая исходный код своих приложений. В частности, вы узнаете, как объявлять переменные разных типов и работать с ними, а также о значительных изменениях в C# 8.0, возникших благодаря введению ссылочных типов, допускающих значение null (nullable).
Глава 3 «Управление потоком исполнения и преобразование типов» охватывает использование операторов для выполнения простых действий с переменными, включая сравнения, написание кода, который принимает решения, повторяет блок операторов и выполняет преобразование между типами. Глава также освещает написание кода в целях защиты от ошибок при их неизбежном возникновении.
Глава 4 «Разработка, отладка и тестирование функций» посвящена соблюдению принципа программирования DRY (Do not repeat yourself — «Не повторяйся») при создании многократно используемых функций. Кроме того, вы узнаете, как с помощью инструментов отладки отслеживать и устранять ошибки, мониторить код в процессе его выполнения для диагностики проблем и тщательно тестировать код, чтобы устранять ошибки и обеспечивать его стабильность и надежность, прежде чем развертывать его в производственной среде.
Глава 5 «Создание пользовательских типов с помощью объектно-ориентированного программирования» знакомит с различными категориями элементов, которые может иметь тип, в том числе полями для хранения данных и методами для выполнения действий. Вы будете использовать концепции ООП, такие как агрегирование и инкапсуляция. Вы изучите языковые функции, такие как поддержка синтаксиса кортежей и переменные out, литералы для значений по умолчанию и автоматически определяемые имена элементов кортежей.
Глава 6 «Реализация интерфейсов и наследование классов» посвящена созданию новых типов из существующих с использованием объектно-ориентированного программирования (ООП). Вы узнаете, как определять операторы и локальные функции, делегаты и события, как реализовывать интерфейсы с базовыми и производными классами, как переопределять элементы типа, а также изучите концепции полиморфизма, научитесь создавать методы расширения и поймете, как выполнять приведение классов в иерархии наследования.
Глава 7 «Описание и упаковка типов .NET» представляет версии .NET Core и содержит таблицы, в которых приведены новые функции, а также типы .NET Core, соответствующие стандарту .NET, и их отношение к языку C#. Вы узнаете, как разворачивать и упаковывать собственные приложения и библиотеки.
Глава 8 «Работа с распространенными типами .NET» описывает типы, позволяющие вашему коду выполнять типовые практические задачи, такие как управление числами и текстом, хранение элементов в коллекциях и реализация интернационализации.
Глава 9 «Работа с файлами, потоками и сериализация» касается взаимодействия с файловой системой, чтения и записи в файлы и потоки, кодирования текста и форматов сериализации, таких как JSON и XML.
Глава 10 «Защита данных и приложений» научит защите данных с помощью шифрования от просмотра злоумышленниками, а также применению хеширования и цифровых подписей в целях защиты от управления или искажения данных. Вы также узнаете об аутентификации и авторизации для защиты приложений от неавторизованных пользователей.
Глава 11 «Работа с базами данных с помощью Entity Framework Core» научит чтению и записи данных в базы данных, такие как Microsoft SQL Server и SQLite, с использованием технологии объектно-реляционного отображения данных Entity Framework Core.
Глава 12 «Создание запросов и управление данными с помощью LINQ» рассказывает о языковых расширениях Language INtegrated Queries (LINQ), которые позволяют работать с последовательностями элементов с их дальнейшей фильтрацией, сортировкой и проецированием на различные программные выходы.
Глава 13 «Улучшение производительности и масштабируемости с помощью многозадачности» рассказывает, как одновременно выполнять несколько действий, чтобы повысить эти показатели. Вы узнаете о функции asyncMain и о том, как использовать типы в пространстве имен System.Diagnostics в целях мониторинга вашего кода для измерения производительности и эффективности.
Глава 14 «Практическое применение C# и .NET» знакомит с типами кросс-платформенных приложений, которые можно создавать с помощью C# и .NET.
Глава 15 «Разработка сайтов с помощью ASP.NET Core Razor Pages» посвящена основам создания сайтов с использованием современной HTTP-архитектуры на стороне сервера с применением ASP.NET Core. Вы научитесь проектировать простые сайты, задействуя функцию ASP.NET Core, известную как Razor Pages.
Глава 16 «Разработка сайтов с использованием паттерна MVC» посвящена созданию сложных сайтов таким образом, чтобы можно было легко их тестировать и управлять ими с помощью команд, использующих ASP.NET Core MVC. В данной главе также описаны такие темы, как конфигурации запуска, аутентификация, маршруты, модели, представления и контроллеры.
Глава 17 «Разработка сайтов с помощью системы управления контентом (CMS)» описывает, как система управления контентом (Content Management System, CMS) позволяет разработчикам быстро создавать сайты с настраиваемым пользовательским интерфейсом администратора, с которым могут работать даже неспециалисты, для создания собственного контента и управления им. В качестве примера вы познакомитесь с простым доступным исходным программным кодом .NET Core под названием Piranha CMS.
Глава 18 «Разработка и использование веб-сервисов» описывает, как создавать веб-сервисы внутренней архитектуры REST с помощью ASP.NET Core Web API и как правильно применять их, задействуя созданные HTTP-клиенты.
Глава 19 «Разработка интеллектуальных приложений с помощью алгоритмов машинного обучения» посвящена алгоритмам машинного обучения Microsoft с доступным исходным кодом ML.NET, который можно применять для встраивания адаптивного интеллекта в любое кросс-платформенное приложение .NET, такое как сайт цифровой коммерции, предоставляющий посетителям рекомендации по продукту, который они могут добавить в корзину.
Глава 20 «Разработка настольных Windows-приложений» посвящена разработке приложений с помощью кросс-платформенного .NET Core и Visual Studio Code. В данной главе описывается, как .NET Core 3.0 и Windows Desktop Pack позволяют приложениям Windows Forms и WPF эффективно работать в .NET Core. Вдобавок вы изучите основы XAML, который позволяет определить пользовательский интерфейс графического приложения для Windows Presentation Foundation (WPF) или Universal Windows Platform (UWP). Вы будете применять принципы и функции Fluent Design в целях изучения приложения UWP. Приложения, описанные в этой главе, должны быть разработаны с помощью Visual Studio 2019 в Windows 10.
Глава 21 «Разработка кросс-платформенных мобильных приложений с помощью Xamarin.Forms» посвящена разработке кросс-платформенных веб-приложений для платформ iOS и Android. Приложение, описанное в данной главе, будет разработано с помощью Visual Studio 2019 для Mac с операционной системой macOS.
Приложение содержит ответы на вопросы, приведенные в конце практически каждой главы.
Необходимое программное обеспечение
Вы можете разрабатывать и разворачивать приложения C# и .NET Core с использованием Visual Studio Code на многих платформах, включая Windows, macOS и большинство модификаций Linux. Вам необходима операционная система, поддерживающая Visual Studio Code, и подключение к Интернету (главы 1–19).
Вам понадобится операционная система Windows 10 для разработки приложений, описанных в главе 20.
Вам понадобится операционная система macOS для разработки приложений, описанных в главе 21, поскольку для компиляции приложений iOS вам потребуются macOS и Xcode.
Условные обозначения
В данной книге вы увидите текст, оформленный различными стилями. Ниже я привел их примеры и объяснил, что означает это форматирование.
URL и имена папок оформляются шрифтом без засечек. Слова, которые вы видите на экране, например в меню или диалоговых окнах, отображаются в тексте так: «Нажмите кнопку Next (Далее) для перехода к следующему экрану».
Фрагменты кода в тексте, имена таблиц баз данных, файлов, расширения файлов, пути, ввод пользователя, а также учетные записи в Twitter оформляются следующим образом: «Папки Controllers, Models и Views содержат классы ASP.NET Core и файлы .cshtml для выполнения на сервере».
Блок кода выглядит так:
// хранение элементов в индексированных позициях
names[0] = "Kate";
names[1] = "Jack";
names[2] = "Rebecca";
names[3] = "Tom";
Если нужно обратить ваше внимание на определенную часть приведенного кода, то соответствующие строки или элементы будут выделены полужирным моноширинным шрифтом:
// хранение элементов в индексированных позициях
names[0] = "Kate";
names[1] = "Jack";
names[2] = "Rebecca";
names[3] = "Tom";
Весь ввод/вывод в командной строке дается так:
dotnet new console
Новые термины и важные слова выделены курсивом.
Ссылки на внешние источники для более детального ознакомления оформлены так.
Советы и рекомендации экспертов по разработке оформлены так.
Скачивание примеров кода
Файлы с примерами кода из этой книги вы можете скачать на сайте GitHub по адресу github.com/PacktPublishing/CSharp-8.0-and-.NET-Core-3.0-Modern-Cross-Platform-Development-Third-Edition.
Скачивание цветных изображений для книги
Вы также можете просмотреть и скачать сверстанный PDF-файл с цветными версиями иллюстраций. Полноцветные изображения помогут быстрее разобраться в примерах. Файл доступен по адресу static.packt-cdn.com/downloads/9781788478120_ColorImages.pdf.
От издательства
Ваши замечания, предложения, вопросы отправляйте по адресу comp@piter.com (издательство «Питер», компьютерная редакция).
Мы будем рады узнать ваше мнение!
На веб-сайте издательства www.piter.com вы найдете подробную информацию о наших книгах.
1. Привет, C#! Здравствуй, .NET Core!
Эта глава посвящена настройке среды разработки; сходствам и различиям .NET Core, .NET Framework и .NET Standard; а также тому, как применять различные инструменты для создания простейших приложений с помощью C# и .NET Core, используя Microsoft Visual Studio Code.
После первой главы эту книгу можно разделить на три части: первая знакомит с грамматикой и терминологией языка C#; вторая содержит описание типов, доступных в .NET Core для создания функций приложения; третья включает примеры распространенных кросс-платформенных приложений, которые вы можете создавать с использованием C# и .NET. Последние две главы посвящены двум типам приложений, которые могут быть разработаны с помощью языка C#, однако первая не описывает разработку кросс-платформенных приложений, а вторая еще не задействует .NET Core, поэтому эти главы следует рассматривать в качестве дополнительных.
Изучать сложные темы многим людям проще в процессе имитации и повторения, а не во время чтения детальных теоретических объяснений. Поэтому я тоже не буду перегружать книгу подробным объяснением каждого шага. Идея в том, чтобы дать вам задание написать некий код, собрать приложение и посмотреть, что происходит при запуске.
Вам не нужно будет разбираться, как все работает. Вы поймете это в процессе создания собственных приложений, выйдя за рамки того, чему может научить книга.
Выражаясь словами Сэмюэля Джонсона, составившего в 1755 году толковый словарь английского языка, я, вероятно, допустил «несколько диких промахов и забавных несуразиц, от которых не может быть свободна ни одна из работ подобной сложности». Я принимаю на себя полную ответственность за них и надеюсь, что вы оцените мою попытку «поймать ветер» и написать книгу о таких быстроразвивающихся технологиях, как C# и .NET Core, и приложениях, которые можете разработать с их помощью.
В этой главе:
• настройка среды разработки;
• знакомство с .NET;
• разработка консольных приложений с использованием Visual Studio Code;
• управление исходным кодом с помощью GitHub;
• поиск справочной информации.
Настройка среды разработки
Прежде чем приступать к программированию, вам нужно настроить редактор кода для C#. Microsoft предоставляет целое семейство редакторов и интегрированных сред разработки (Integrated Development Environment, IDE), содержащих редактор кода C#:
• Visual Studio Code;
• Visual Studio 2019;
• Visual Studio 2019 для Mac.
Использование Visual Studio Code для разработки кросс-платформенных приложений
Microsoft Visual Studio Code — cамая современная и упрощенная кросс-платформен-ная среда разработки, разработанная корпорацией Microsoft. Ее можно запустить во всех распространенных операционных системах, включая Windows, macOS и множество разновидностей Linux, таких как Red Hat Enterprise Linux (RHEL) и Ubuntu.
Visual Studio Code — хороший выбор для современной кросс-платформенной разработки, поскольку имеет обширный и развивающийся набор расширений для поддержки многих языков, помимо C#. И, будучи кросс-платформенной и простой средой разработки, Visual Studio Code может быть установлена на всех платформах, на которых будут установлены ваши приложения, для выполнения быстрых правок и прочих задач.
Visual Studio Code — редактор кода для разработки кросс-платформенных приложений. Поэтому я решил использовать данную программу во всех главах книги, кроме двух последних, где требуются недоступные в Visual Studio Code специальные функции для разработки приложений в операционной системе Windows и мобильных приложений.
О намерениях Microsoft в отношении Visual Studio Code можно прочитать на сайте github.com/Microsoft/vscode/wiki/Roadmap.
Если вы предпочитаете использовать Visual Studio 2019 или Visual Studio для Mac вместо Visual Studio Code, то, конечно, это возможно, но я предполагаю, что вы уже знакомы с данными приложениями, и потому не буду давать в книге пошаговые инструкции по их применению.
Информацию, касающуюся Visual Studio Code и Visual Studio 2019, можно получить на сайте www.itworld.com/article/3403683/visual-studio-code-stepping-on-visual-studios-toes.html.
Использование Visual Studio 2019 для разработки Windows-приложений
Программа Microsoft Visual Studio 2019 работает только в операционной системе Windows версии 7 SP1 или более поздней. Для создания приложений универсальной платформы Windows (Universal Windows Platform, UWP) вам необходимо запустить приложение в операционной системе Windows 10. Это единственный инструмент Microsoft для разработчиков, который может создавать приложения для Windows, поэтому мы будем ссылаться на него в главе 20.
Использование Visual Studio для Mac с целью разработки мобильных приложений
Разработка приложений для устройств под управлением операционной системы iOS и iPadOS требует наличия компьютера с установленной системой macOS и средой Xcode. Вы можете использовать Visual Studio 2019 на Windows с установленными расширениями для Xamarin для написания кросс-платформенного мобильного приложения, но для его компиляции все равно понадобятся macOS и Xcode.
Итак, мы будем использовать программу Visual Studio 2019 для Mac в операционной системе macOS в главе 21.
Рекомендуемые инструменты и операционные системы
В табл. 1.1 приведены инструменты и операционные системы, которые я рекомендую использовать для каждой из глав в этой книге.
Таблица 1.1
| Глава |
Среда разработки |
Операционная система |
| 1–19 |
Visual Studio Code |
Windows, macOS или Linux |
| 20 |
Visual Studio 2019 |
Windows 10 |
| 21 |
Visual Studio 2019 для Mac |
macOS |
Работая над этой книгой, я использовал MacBook Pro и следующее программное обеспечение:
• Visual Studio Code на macOS как мой основной редактор кода;
• Visual Studio Code в операционной системе Windows 10 (в виртуальной машине) для тестирования поведения, специфичного для операционной системы, например работы с файловой системой;
• Visual Studio 2019 в операционной системе Windows 10 (в виртуальной машине);
• Visual Studio 2019 для Mac в операционной системе macOS для создания мобильных приложений.
Google и Amazon — сторонники среды Visual Studio Code, о чем можно прочитать на сайте www.cnbc.com/2018/12/20/microsoft-cmo-capossela-says-google-employees-use-visual-studio-code.html.
Кросс-платформенное развертывание
Выбранные вами среда разработки и используемая операционная система не влияют на то, где могут быть развернуты ваши программы.
Сейчас .NET Core поддерживает следующие платформы для развертывания:
• Windows — Windows 7 SP1 или версии выше. Windows 10 версия 1607 или выше; Windows Server 2012 R2 SP1 или версии выше. Nano Server версия 1803 или выше;
• Mac — macOS High Sierra (версия 10.13) или версии выше;
• Linux — RHEL 6 или версии выше. RHEL, CentOS, Oracle Linux версия 7 или выше. Ubuntu 16.04 или версии выше. Fedora 29 или версии выше. Debian 9 или версии выше. openSUSE 15 или версии выше.
С официальным списком поддерживаемых операционных систем можно ознакомиться на сайте github.com/dotnet/core/blob/master/release-notes/3.0/3.0-supported-os.md.
Знакомство с версиями Microsoft Visual Studio Code
Компания Microsoft почти каждый месяц выпускает релиз и обновляет программу Visual Studio Code. Например:
• Version 1.38, август 2019 года, функциональная версия;
• Version 1.38.1, август 2019 года, исправленная версия.
С последними версиями можно ознакомиться на сайте code.visualstudio.com/updates.
В книге используется версия 1.38.1, выпущенная 11 сентября 2019 года. Однако версия Microsoft Visual Studio Code менее важна, чем версия расширения C# for Visual Studio Code, которое вы установите позже.
Расширение C# не требуется, однако предоставляет технологию IntelliSense при вводе, навигации по коду и отладке, поэтому его весьма желательно установить. Для поддержки C# 8.0 вам необходимо установить расширение C# версии 1.21.3 или выше.
В этой книге я познакомлю вас с сочетаниями клавиш и интерфейсом программы Visual Studio Code в операционной системе macOS. Среды Visual Studio Code для операционных систем Windows и Linux практически идентичны, однако комбинации клавиш, скорее всего, будут отличаться.
В табл. 1.2 перечислены некоторые распространенные сочетания клавиш.
Таблица 1.2
| Действие |
В macOS |
В Windows |
| Отобразить панель команд |
Cmd+Shift+P, F1 |
Ctrl+Shift+P, F1 |
| Переход к определению |
F12 |
F12 |
| Назад |
Ctrl+– |
Alt+← |
| Далее |
Ctrl+Shift+– |
Alt+→ |
| Отобразить терминал |
Ctrl+’ |
Ctrl+’ |
| Новый терминал |
Ctrl+Shift+’ |
Ctrl+Shift+’ |
| Переключить на строчный комментарий |
Ctrl+/ |
Ctrl+/ |
| Переключить на блочный комментарий |
Shift+Option+A |
Shift+Alt+A |
Я рекомендую вам скачать PDF-файл, в котором описаны сочетания клавиш для вашей операционной системы:
• Windows: code.visualstudio.com/shortcuts/keyboard-shortcuts-windows.pdf;
• macOS: code.visualstudio.com/shortcuts/keyboard-shortcuts-macos.pdf;
• Linux: code.visualstudio.com/shortcuts/keyboard-shortcuts-linux.pdf.
Узнать о привязках клавиш по умолчанию для Visual Studio Code и о том, как их настроить, можно на сайте code.visualstudio.com/docs/getstarted/keybindings.
Среда разработки Visual Studio Code совершенствовалась последние несколько лет благодаря компании Microsoft. Существует также версия Insiders, которая постоянно обновляется.
Скачивание и установка среды Visual Studio Code
Теперь вы готовы скачать и установить среду Visual Studio Code, ее расширение C#, среду .NET Core 3.0 и пакет SDK.
1. Скачайте и установите либо стабильную версию Stable, либо версию Insiders среды Visual Studio Code, перейдя по ссылке code.visualstudio.com.
2. Скачайте и установите среду .NET Core и пакет SDK, перейдя по ссылке www.microsoft.com/net/download.
3. Для установки расширения C# вам необходимо сначала запустить приложение Visual Studio Code.
4. В Visual Studio Code нажмите значок Extensions (Расширения) или выберите View—>Extensions (Вид—>Расширения).
5. C# — одно из самых популярных доступных расширений, поэтому вы должны увидеть его в верхней части списка или можете ввести C# в поле поиска, как показано на рис. 1.1.
Рис. 1.1
6. Нажмите кнопку Install (Установить) и дождитесь скачивания и установки пакета.
Более подробно о поддержке средой разработки Visual Studio Code языка C# можно узнать на сайте code.visualstudio.com/docs/languages/csharp.
Установка расширений
В последующих главах этой книги вы будете использовать дополнительные расширения. В табл. 1.3 представлен их перечень.
Таблица 1.3
| Расширение |
Описание |
| C# для Visual Studio Code (работает на OmniSharp) мс-vscode.csharp |
Поддержка редактирования C#, включая подсветку синтаксиса, IntelliSense, переход к определению, поиск ссылок, поддержка отладки для .NET Core (CoreCLR) и проектов project.json и csproj для операционных систем Windows, macOS и Linux |
| Документация XML в языке C#. Комментарии k--kato.docomment |
Создание комментариев документации XML для Visual Studio Code |
| Расширения C# jchannon.csharpextensions |
Добавление класса C#, интерфейса C#, поля и свойства из конструкторов, конструктора из свойств |
| REST-клиент humao.rest-client |
Отправка HTTP-запроса и просмотр ответа непосредственно в Visual Studio Code |
| Декомпилятор ILSpy .NET icsharpcode.ilspy-vscode |
Декомпиляция сборки MSIL — поддержка среды .NET Framework, .NET Core и .NET Standard |
| SharpPad jmazouri.sharppad |
Проверка результатов вашего кода. Код работает аналогично таким инструментам, как LinqPad и RoslynPad |
Знакомство с .NET
.NET Framework, .NET Core, Xamarin и .NET Standard — связанные и зависимые друг от друга платформы для разработки приложений и сервисов. В данном разделе я познакомлю вас с каждой из этих платформ .NET.
Обзор .NET Framework
.NET Framework — платформа для разработки, включающая общеязыковую исполняющую среду (Common Language Runtime, CLR), которая управляет выполнением кода, и обширную библиотеку базовых классов (Base Class Library, BCL) для создания приложений. Платформа .NET Framework изначально проектировалась как кросс-платформенная, но впоследствии компания Microsoft сконцентрировалась на внедрении платформы и обеспечении максимально эффективной работы в операционной системе Windows.
Платформа версии .NET Framework 4.5.2 и более поздних версий — официальный компонент операционной системы Windows. .NET Framework установлена на более чем одном миллиарде компьютеров, ввиду чего должна обновляться как можно реже. Даже исправление неполадок могут вызвать проблемы, поэтому данная платформа обновляется нечасто.
Все приложения на компьютере, разработанные для .NET Framework, используют одну и ту же версию CLR и библиотек, хранящихся в глобальном кэше сборок (Global Assembly Cache, GAC), что может привести к неполадкам, если некоторым из них потребуется определенная версия для совместимости.
В сущности, платформа .NET Framework работает только в среде Windows и считается устаревшей. Не рекомендуется использовать данную платформу для создания новых приложений.
Проекты Mono и Xamarin
Сторонние разработчики создали .NET-проект под названием Mono. Хоть он и был кросс-платформенным, он значительно отставал от официальной реализации .NET Framework.
Более подробную информацию о проекте Mono можно найти на сайте www.mono-project.com.
Проект Mono занял нишу в качестве основы мобильной платформы Xamarin, а также кросс-платформенных платформ для разработки игр, таких как Unity.
Более подробную информацию о Unity можно получить на сайте docs.unity3d.com.
В 2016 году корпорация Microsoft приобрела компанию Xamarin и теперь бесплатно предоставляет пользователям дорогостоящее решение Xamarin в качестве расширения для среды разработки Visual Studio 2019. Кроме того, корпорация переименовала инструментарий для разработчика Xamarin Studio в Visual Studioдля Mac и внедрила возможность создавать другие типы приложений. В Visual Studio 2019 для Mac корпорация Microsoft заменила части редактора Xamarin Studio на части из Visual Studio для Windows, чтобы обеспечить знакомый пользовательский опыт и производительность.
Обзор .NET Core
Сегодня мы живем в реально кросс-платформенном мире. Современные методы мобильной и облачной разработки уменьшили прежнюю значимость операционной системы Windows. Поэтому Microsoft активно работает над отделением платформы .NET от Windows, прерыванием их тесных связей. Переписывая код .NET для обеспечения истинной кросс-платформенности, сотрудники корпорации воспользовались моментом, чтобы реорганизовать компоненты .NET и удалить те из них, которые не считаются ядром.
В итоге свет увидел новый продукт — .NET Core, включающий кросс-платформенную реализацию рабочей общеязыковой исполняющей среды под названием CoreCLR и набор библиотек классов CoreFX.
Скотт Хантер, директор .NET-подразделения Microsoft, утверждает: «Сорок процентов пользователей .NET Core — новые разработчики. Мы хотим привлекать новых людей».
Платформа .NET Core быстро развивается и ввиду возможности ее развертывания рядом с приложением может часто меняться, и эти изменения не повлияют на другие приложения .NET Core на той же машине. Обновления, которые Microsoft может внести в .NET Core, нельзя добавить в .NET Framework.
Узнать больше о позиционировании Microsoft .NET Core и .NET Framework можно на сайте devblogs.microsoft.com/dotnet/update-on-net-core-3-0-and-net-framework-4-8/.
Обзор последующих версий .NET
На конференции разработчиков Microsoft Build в мае 2019 года команда .NET объявила, что после выпуска .NET Core 3.0 в сентябре 2019 года .NET Core будет переименована в .NET, а в номере основной версии будет пропущен номер 4, чтобы избежать путаницы с NET Framework 4.x. Итак, следующей версией .NET Core будет версия .NET 5.0, выпуск которой запланирован на ноябрь 2020 года. После этого корпорация Microsoft планирует выпускать ежегодные основные версии каждый ноябрь, подобно тому как Apple выпускает основные версии iOS каждую вторую неделю в сентябре.
Более подробную информацию о планах корпорации Microsoft, касающихся версии .NET 5.0, можно найти на сайте devblogs.microsoft.com/dotnet/introducing-net-5/.
В табл. 1.4 показано, когда были выпущены основные версии .NET Core, когда запланированы будущие выпуски и какая версия используется в этой книге.
Таблица 1.4
| Версия |
Дата выпуска |
Издание |
Выпуск |
| .NET Core RC1 |
Ноябрь 2015 года |
Первое |
Март 2016 года |
| .NET Core 1.0 |
Июнь 2016 года |
|
|
| .NET Core 1.1 |
Ноябрь 2016 года |
|
|
| .NET Core 1.0.4 и .NET Core 1.1.1 |
Март 2017 года |
Второе |
Март 2017 года |
| .NET Core 2.0 |
Август 2017 года |
|
|
| Обновление .NET Core для UWP в Windows 10 Fall Creators |
Октябрь 2017 года |
Третье |
Ноябрь 2017 года |
| .NET Core 2.1 |
Май 2018 года |
|
|
| .NET Core 2.2 |
Декабрь 2018 года |
|
|
| .NET Core 3.0 |
Сентябрь 2019 года |
Четвертое |
Октябрь 2019 года |
| .NET Core 3.1 (текущая версия) |
Декабрь 2019 года |
|
Декабрь 2019 года |
| .NET 5.0 |
Ноябрь 2020 года |
|
|
| .NET 6.0 |
Ноябрь 2021 года |
|
|
Я не могу обещать, что 5-е и 6-е издания этой книги будут соответствовать будущим выпускам .NET.
Поддержка .NET Core
Версии .NET Core сопровождаются либо долгосрочной поддержкой (long term support, LTS), либо текущей (current), как описано ниже.
• Релизы LTS стабильны и требуют меньше обновлений в течение срока их службы. Это хороший выбор для приложений, не требующих частых обновлений. Релизы LTS будут поддерживаться в течение трех лет после их выпуска. .NET Core 3.1 будет выпуском LTS.
Версии .NET Core 1.0 и 1.1 достигли конца срока службы и прекратили поддержку 27 июня 2019 года через три года после первоначального выпуска .NET Core 1.0.
• Текущие релизы включают функции, которые могут меняться в зависимости от обратной связи. Это хороший выбор для активно разрабатываемых приложений, поскольку они предоставляют доступ к последним обновлениям. После трех месяцев обслуживания предыдущая вспомогательная версия больше не будет поддерживаться. Например, после выпуска версии 1.2 у систем, работающих с версией 1.1, будет три месяца на обновление до версии 1.2, чтобы пользоваться поддержкой. Версия .NET Core 3.0 — текущий релиз, поэтому если вы еще не обновились хотя бы до .NET Core 3.1, необходимо сделать это как можно скорее.
В целях обеспечения безопасности и надежности критические обновления безопасности и надежности поставляются для релизов независимо от режима поддержки. Для получения поддержки вы всегда должны быть в курсе последних обновлений. Например, если система работает под версией 1.0, а версия 1.0.1 уже выпущена, то, значит, необходимо установить версию 1.0.1.
В чем особенность .NET Core
.NET Core менее объемна, чем текущая версия .NET Framework, из-за того, что устаревшие технологии были удалены. Например, Windows Forms и Windows Presentation Foundation (WPF) можно использовать для создания приложений с графическим интерфейсом пользователя (graphical user interface, GUI), однако они тесно связаны с экосистемой операционной системы Windows, поэтому были удалены из .NET Core в операционных системах macOS и Linux.
Одна из новых функций .NET Core 3.0 — поддержка запуска старых приложений Windows Forms и WPF с помощью пакета Windows Desktop Pack, входящего в состав версии .NET Core 3.0 для операционной системы Windows, поэтому он считается более полным, чем пакет SDK для операционных систем macOS и Linux. При необходимости вы можете внести небольшие изменения в устаревшее приложение Windows, а затем перестроить его для .NET Core, чтобы воспользоваться новыми функциями и обновлениями. О поддержке разработки таких типов приложений Windows вы узнаете в главе 20.
Универсальная платформа Windows (Universal Windows Platform, UWP) — последняя технология, применяемая для создания Windows-приложений, построенная на измененной версии .NET Core. Платформа UWP не входит в состав .NET Core, поскольку не считается кросс-платформенной.
Компоненты ASP.NET Web Forms и Windows Communication Foundation (WCF) представляют собой устаревшие технологии для создания веб-приложений и сервисов, используемые сегодня лишь некоторыми разработчиками, ввиду чего эти компоненты также были удалены из .NET Core. Вместо этого разработчики предпочитают задействовать компоненты ASP.NET MVC и ASP.NET Web-API. Обе технологии были реорганизованы и объединены в новый продукт, ASP.NET Core, работающий на платформе .NET Core. Вы узнаете о них в главах 15, 16 и 18.
Некоторые разработчики .NET Framework озабочены тем, что в .NET Core отсутствуют веб-формы ASP.NET, WCF и Windows Work Flow (WF) и надеются, что корпорация Microsoft пересмотрит данный вопрос. Существуют проекты с открытым исходным кодом, позволяющие WCF и WF перейти на .NET Core. Более подробную информацию можно найти на сайте devblogs.microsoft.com/dotnet/supporting-the-community-with-wf-and-wcf-oss-projects/.
Entity Framework (EF)6 — технология объектно-реляционного отображения для работы с информацией, хранящейся в реляционных базах данных, таких как Oracle и Microsoft SQL Server. За годы развития данная технология погрязла в различных доработках, поэтому ее новый кросс-платформенный API был оптимизирован и стал поддерживать такие нереляционные базы данных, как Microsoft Azure Cosmos DB. Теперь технология называется Entity Framework Core. Об этом вы узнаете в главе 11.
Если у вас есть приложения, использующие устаревший EF, то его версия .NET поддерживается в .NET Core 3.0.
Помимо удаления значительных частей из .NET Framework для создания .NET Core, Microsoft разделила .NET Core на пакеты NuGet, представляющие собой небольшие функциональные части, которые можно развернуть независимо.
Основная цель корпорации Microsoft — не делать ядро .NET меньше, чем .NET Framework. Цель состоит в том, чтобы разбить .NET Core на компоненты для поддержки современных технологий и уменьшения числа зависимостей. Тогда для развертывания нужны будут только те пакеты, которые необходимы вашему приложению.
Обзор .NET Standard
В 2019 году с платформой .NET сложилась следующая ситуация: существует три ветви платформы .NET, все из которых разрабатываются корпорацией Microsoft:
• .NET Core — для кросс-платформенных и новых приложений;
• .NET Framework — для устаревших приложений;
• Xamarin — для мобильных приложений.
Все они имеют свои достоинства и недостатки, поскольку предназначены для разных ситуаций. Это привело к тому, что разработчик должен изучить три платформы, каждая из которых раздражает своими странностями и ограничениями. По этой причине Microsoft работает над .NET Standard: спецификацией для набора API, которая может быть реализована на всех платформах .NET. Например, указанием на наличие базовой поддержки является совместимость платформы с .NET Standard 1.4.
В рамках .NET Standard 2.0 и более поздних версий корпорация Microsoft привела все три платформы в соответствие с современным минимальным стандартом, что значительно упростило разработчикам совместное использование кода с любой разновидностью .NET.
Это позволило добавить в .NET Core 2.0 и более поздние версии ряд недостающих API, необходимых разработчикам для переноса старого кода, написанного для .NET Framework, в кросс-платформенный .NET Core. Однако некоторые API уже реализованы, но при работе выдают исключение о том, что фактически не должны использоваться! Обычно это происходит из-за различий в операционной системе, в которой вы запускаете .NET Core. Как обрабатывать эти исключения, вы узнаете в главе 2.
Важно понимать, что .NET Standard — это просто стандарт. Вы не можете установить .NET Standard так же, как не можете установить HTML5. Чтобы использовать HTML5, вам необходимо установить браузер, который реализует стандарт HTML5.
Чтобы использовать .NET Standard, необходимо установить платформу .NET, которая реализует спецификацию .NET Standard. .NET Standard 2.0 реализована в последних версиях .NET Framework, .NET Core и Xamarin.
Последняя версия .NET Standard 2.1 реализована только в .NET Core 3.0, Mono и Xamarin. Для некоторых функций C# 8.0 требуется .NET Standard 2.1. Она не реализована в .NET Framework 4.8, поэтому мы рассматриваем .NET Framework как устаревшую.
Версии .NET Standard и поддерживаемые ими платформы .NET перечислены на сайте github.com/dotnet/standard/blob/master/docs/versions.md.
Платформы .NET в изданиях этой книги
В первом издании этой книги, написанном в марте 2016 года, я сосредоточился на функциональности .NET Core, но использовал .NET Framework, когда важные или полезные функции еще не были реализованы в .NET Core, поскольку это было еще до окончательного выпуска .NET Core 1.0. Visual Studio 2015 использовался для большинства примеров, Visual Studio Code описывался кратко.
Во втором издании все примеры кода .NET Framework были (почти) полностью убраны, чтобы читатели могли сосредоточиться на примерах .NET Core, которые действительно работают кросс-платформенно. Третье издание завершило переход. Оно было переписано так, чтобы весь код .NET Core был чистым. Но предоставление пошаговых инструкций для нескольких инструментов привело к ненужному усложнению.
В этом, четвертом, издании я продолжу тенденцию, показывая только примеры кодирования с использованием Visual Studio Code для всех глав, кроме двух последних. В главе 20 вам необходимо задействовать Visual Studio 2019, работающую в операционной системе Windows 10, а в главе 21 — Visual Studio 2019 для Mac.
Знакомство с промежуточным языком
Компилятор C# (под названием Roslyn), используемый инструментом командной строки dotnet, конвертирует ваш исходный код на языке C# в код на промежуточном языке (Intermediate Language, IL) и сохраняет его в сборке (DLL- или EXE-файле). Операторы кода на промежуточном языке (IL) похожи на код ассемблера, только выполняются с помощью виртуальной машины CoreCLR в .NET Core.
В процессе работы код IL загружается CoreCLR из сборки, динамически (Just-in-Time, JIT) компилируется компилятором в собственные инструкции CPU, а затем исполняется с помощью CPU на вашем компьютере. Преимущество такого трехэтапного процесса компиляции заключается в том, что Microsoft может создавать CLR не только для Windows, но и для Linux и macOS. Один и тот же код IL запускается в любой среде благодаря второму процессу компиляции, который генерирует код для конкретной операционной системы и набора команд CPU.
Независимо от того, на каком языке написан исходный код, например C#, Visual Basic или F#, все приложения .NET используют код IL для своих инструкций, хранящихся в сборке. Корпорация Microsoft и другие предоставляют инструменты дизассемблера, которые могут открывать сборку и раскрывать данный код IL, например расширение декомпилятора ILSpy .NET.
Обзор .NET Native
Технология .NET Native — еще одна инициатива в области .NET. С ее помощью код на языке C# компилируется в машинный код методом компиляции перед исполнением (ahead-of-time, AoT) вместо общеязыковой исполняющей среды, использующейся для динамической компиляции (just-in-time, JIT) в промежуточный язык IL, и только потом в машинный язык.
Технология .NET Native улучшает скорость выполнения приложений и уменьшает объемы выделяемой приложению памяти за счет генерации нативного кода во время сборки и последующего его развертывания вместо промежуточного кода.
Более подробную информацию о .NET Native можно найти на сайте github.com/dotnet/corert/blob/master/Documentation/intro-to-corert.md.
Сравнение технологий .NET
В табл. 1.5 перечисляются и сравниваются технологии .NET.
Таблица 1.5
| Технология |
Возможности |
Хостовая ОС |
| .NET Core |
Современный набор функций, полная поддержка C# 8.0, портирование существующих и создание новых приложений для Windows и веб-приложений и сервисов |
Windows, macOS, Linux |
| .NET Framework |
Устаревший набор функций, ограниченная поддержка C# 8.0, поддержка существующих приложений |
Только Windows |
| Xamarin |
Только для мобильных устройств |
Android, iOS, macOS |
Корпорация Microsoft обещает, что к концу 2020 года вместо трех будет одна платформа .NET. Планируется, что в .NET 5.0 будет одна библиотека BCL и две среды выполнения: одна оптимизирована для серверных или офисных сценариев, таких как сайты и офисные приложения Windows, основанные на среде выполнения .NET Core, а другая — для мобильных приложений на основе среды Xamarin.
Разработка консольных приложений с использованием Visual Studio Code
Цель данного раздела — разработка консольных приложений с помощью среды разработки Visual Studio Code. Инструкции и снимки экрана в этом разделе относятся к операционной системе macOS, но те же действия будут работать с Visual Studio Code в операционных системах Windows и Linux.
Основными отличиями послужат собственные действия командной строки, такие как удаление файла: как команда, так и путь, вероятно, будут разными для операционных систем Windows или macOS и Linux. Однако инструмент командной строки dotnet будет одинаковым на всех платформах.
Написание кода с помощью Visual Studio Code
Начнем писать код!
1. Запустите среду разработки Visual Studio Code.
2. В операционной системе macOS выберите File—>Open (Файл—>Открыть) или нажмите сочетание клавиш Cmd+O. В операционной системе Windows выберите File—>Open Folder (Файл—>Открыть папку) или нажмите сочетание клавиш Ctrl+K Ctrl+O. В обеих операционных системах вы можете нажать кнопку Open Folder (Открыть папку) на панели EXPLORER (Проводник) или щелкнуть кнопкой мыши на ссылке Open Folder (Открыть папку) на странице приветствия, как показано на рис. 1.2.
Рис. 1.2
3. В открывшемся диалоговом окне перейдите к своей пользовательской папке в macOS (моя папка называется markjprice), к папке Documents в операционной системе Windows или к любому каталогу или диску, на котором хотите сохранить свои проекты.
4. Нажмите кнопку New Folder (Новая папка) и назовите папку Code.
5. В папке Code создайте подпапку Chapter01.
6. В папке Chapter01 создайте подпапку HelloCS.
7. Выберите папку HelloCS и нажмите кнопку Open (Открыть) в системе macOS или Select Folder (Выбрать папку) в системе Windows.
8. Выберите View—>Terminal (Вид—>Терминал) или в системе macOS нажмите сочетание клавиш Ctrl+` (обратный апостроф) и в системе Windows нажмите Ctrl+' (одинарная кавычка). В операционной системе Windows вводит в заблуждение комбинация клавиш Ctrl+` (обратный апостроф), которая разделяет текущее окно!
9. На панели TERMINAL (Терминал) введите следующую команду:
dotnet new console
10. Вы увидите, что инструмент командной строки dotnet создает в текущей папке проект ConsoleApplication, а на панели EXPLORER (Проводник) отображаются два созданных файла, HelloCS.proj и Program.cs, как показано на рис. 1.3.
Рис. 1.3
11. На панели EXPLORER (Проводник) выберите файл Program.cs, чтобы открыть его в окне редактора. При первом выполнении Visual Studio Code, возможно, придется загружать и устанавливать зависимые объекты C#, такие как OmniSharp, Razor Language Server и отладчик .NET Core, если это не было сделано при установке расширения C#.
12. Если вы видите предупреждение о том, что необходимые ресурсы отсутствуют, то нажмите кнопку Yes (Да), как показано на рис. 1.4.
Рис. 1.4
13. Через несколько секунд на панели EXPLORER (Проводник) появится папка .vscode. Более подробно о ней вы узнаете в главе 4.
14. В файле Program.cs измените строку 9 так, чтобы текст, который выводится в консоль, сообщал: Hello, C#!.
15. Выберите File—>Auto Save (Файл—>Автосохранение). Она избавит вас от необходимости каждый раз вспоминать о сохранении перед повторным обновлением приложения.
Компиляция и запуск кода с использованием инструмента командной строки dotnet
Следующая задача — это компиляция и запуск кода.
1. Выберите View—>Terminal (Вид—>Терминал) и введите следующую команду:
dotnet run
2. На панели TERMINAL (Терминал) отобразится результат запуска вашего приложения, как показано на рис. 1.5.
Рис. 1.5
Скачивание кода решения из репозитория GitHub
Git — широкоиспользуемая система управления исходным кодом. GitHub — компания, веб-сайт и настольное приложение, которое облегчает работу с Git. Корпорация Microsoft недавно приобрела GitHub, поэтому интеграция GitHub с инструментами Microsoft будет усиливаться.
Я использовал веб-сервис GitHub для хранения ответов ко всем упражнениям, приведенным в конце каждой главы этой книги. Получить к ним доступ можно по ссылке github.com/markjprice/cs8dotnetcore3.
Использование системы Git в Visual Studio Code
Среда разработки Visual Studio Code имеет встроенную поддержку системы Git, но требует установки Git в используемой операционной системе, поэтому вам необходимо установить Git 2.0 или более позднюю версию, прежде чем получить доступ к этим функциям. Вы можете скачать дистрибутив Git по ссылке git-scm.com/download.
Если хотите использовать графический интерфейс, то можете скачать GitHub Desktop по ссылке desktop.github.com.
Клонирование репозитория с примерами из книги
Клонируем репозиторий с примерами из книги.
1. Создайте папку Repos в пользовательской папке, или папке Documents, или там, где вы хотите хранить свои репозитории Git.
2. В программе Visual Studio Code откройте папку Repos.
3. Выберите View—>Terminal (Вид—>Терминал) и введите следующую команду:
git clone https://github.com/markjprice/cs8dotnetcore3.git
4. Клонирование всех решений для всех глав займет примерно минуту, как показано на рис. 1.6.
Дополнительную информацию об управлении версиями исходного кода с помощью Visual Studio Code можно получить на сайте code.visualstudio.com/Docs/editor/versioncontrol.
Рис. 1.6
Поиск справочной информации
Этот раздел главы посвящен тому, как найти достоверную информацию о программировании в Интернете.
Знакомство с Microsoft Docs
Главным ресурсом, позволяющим получить справочные сведения об инструментах и платформах Microsoft, ранее был Microsoft Developer Network (MSDN). Теперь это Microsoft Docs, и вы можете найти его по адресу docs.microsoft.com/ru-ru/.
Получение справки для инструмента dotnet
В командной строке вы можете запросить справочную информацию об инструменте dotnet.
1. Чтобы открыть в окне браузера официальную документацию для команды dotnetnew, введите в командной строке или на панели TERMINAL (Терминал) программы Visual Studio Code следующую команду:
dotnet help new
2. Чтобы вывести справочную информацию в командной строке, используйте ключ -h или --help, как показано ниже:
dotnet new console -h
3. Вы увидите следующий вывод (фрагмент):
Console Application (C#)
Author: Microsoft
Description: A project for creating a command-line application that can run on .NET Core on Windows, Linux and macOS
Options:
--langVersion Sets langVersion in the created project file
text - Optional
--no-restore If specified, skips the automatic restore of the project on create.
bool - Optional
Default: false / (*) true
* Indicates the value used if the switch is provided without a value.
Получение определений типов и их элементов
Одна из наиболее полезных клавиш в Visual Studio Code — F12 для перехода к определению. Нажав эту клавишу, вы увидите, как выглядит общедоступное определение типа или элемента, полученное при чтении метаданных в скомпилированной сборке. Некоторые инструменты, такие как ILSpy .NET Decompiler, могут даже выполнить реверс-инжиниринг метаданных и кода IL в C#.
1. В программе Visual Studio Code откройте папку HelloCS.
2. В файле Program.cs в методе Main введите следующий код, чтобы объявить целочисленную переменную z:
int z;
Щелкните на слове int, а затем нажмите клавишу F12 или щелкните правой кнопкой мыши и выберите пункт Go To Definition (Перейти к определению) в контекстном меню. В появившемся окне вы можете увидеть определение типа данных int, как показано на рис. 1.7.
Рис. 1.7
Вы можете видеть, что int:
• определяется с помощью ключевого слова struct;
• находится в сборке System.Runtime;
• находится в пространстве имен System;
• называется Int32;
• является псевдонимом для типа System.Int32;
• реализует интерфейсы, такие как IComparable;
• имеет постоянные значения для своих максимальных и минимальных значений;
• имеет такие методы, как Parse.
При попытке использовать команду Go To Definition (Перейти к определению) иногда появляется сообщение об ошибке No definition found (Определение не найдено). Это связано с тем, что расширение C# «не знает» о текущем проекте. Выберите View—>Command Palette (Вид—>Палитра команд), найдите пункт OmniSharp:Select Project и выберите его, а затем и правильный проект, с которым вы хотите работать.
В настоящее время функция Go To Definition (Перейти к определению) не очень полезна для вас, поскольку вы еще не знаете, что означают эти термины.
К концу первой части книги, в которой рассказывается о C#, вы будете знать достаточно, чтобы эта функция стала полезной.
3. Прокрутите окно редактора кода вниз, чтобы найти метод Parse с параметром string, начинающимся со строки 86, как показано на рис. 1.8.
Рис. 1.8
В комментарии вы увидите, что Microsoft задокументировала возникшие при вызове этого метода исключения, включая ArgumentNullException, FormatException и OverflowException. Теперь мы знаем, что нам необходимо обернуть вызов данного метода в оператор try и какие исключения необходимо перехватить.
Я надеюсь, вам уже не терпится узнать, что все это значит! Наберитесь терпения! Вы почти дошли до конца главы и уже в следующей главе погрузитесь в детали языка C#. Но сначала посмотрим, куда еще вы можете обратиться за получением справочной информации.
Ищем ответы на Stack Overflow
StackOverflow — самый популярный сторонний сайт, на котором можно найти ответы на сложные вопросы по программированию. Он настолько популярен, что поисковые системы, такие как DuckDuckGo, поддерживают специальный режим поиска на этом сайте.
1. Запустите браузер.
2. Перейдите на сайт DuckDuckGo.com и введите такой запрос:
!so securestring
Результаты отображены на рис. 1.9.
Рис. 1.9
Поисковая система Google
Вы можете выполнять поиск на сайте Google, задавая дополнительные настройки, чтобы увеличить вероятность нахождения нужной информации.
1. Перейдите в Google.
2. Например, если вы ищете в Google информацию о garbagecollection с помощью обычного запроса, то увидите ссылку на термин в «Википедии», а также список коммунальных служб, как показано на рис. 1.10.
Рис. 1.10
3. Повысить эффективность поиска можно, ограничив его полезным сайтом, например StackOverflow, и удалив языки, которые могут быть неактуальны в момент поиска, такие как C++, Rust и Python, или добавив C# и .NET, как показано в следующем поисковом запросе:
garbage collection site:stackoverflow.com +C# -Java
Подписка на официальный блог .NET
Отличный блог, на который рекомендую подписаться, чтобы быть в курсе новостей .NET. Его ведут группы разработчиков .NET. Доступен по адресу blogs.msdn.microsoft.com/dotnet/.
Практические задания
Проверим полученные знания. Для этого ответьте на несколько вопросов, выполните приведенные задания и посетите указанные ресурсы, чтобы получить дополнительную информацию.
1.1. Проверочные вопросы
Постарайтесь ответить на следующие вопросы, обращая внимание на то, что, невзирая на возможность найти большинство ответов в этой главе, для ответов на другие вопросы потребуется провести некоторые онлайн-исследования или написать код.
1. Почему на платформе .NET Core для разработки приложений программисты могут использовать разные языки, например C# и F#?
2. Какие команды нужно ввести для создания консольного приложения?
3. Какие команды нужно ввести в окне консоли для сборки и запуска исходного кода на языке C#?
4. Какое сочетание клавиш используется для открытия в программе Visual Studio Code панели TERMINAL (Терминал)?
5. Среда разработки Visual Studio 2019 превосходит Visual Studio Code?
6. Платформа .NET Core лучше .NET Framework?
7. Что такое .NET Standard и почему он так важен?
8. Как называется метод точки входа консольного приложения .NET и как его объявить?
9. Как найти справочную информацию по ключевому слову в C#?
10. Как найти решения общих проблем программирования?
1.2. Практическое задание
Вам не нужно устанавливать среду разработки Visual Studio Code, Visual Studio 2019 или Visual Studio 2019 для Mac, чтобы практиковаться в программировании на языке C#. Посетите сайт .NET Fiddle — dotnetfiddle.net — и начните кодирование в онлайн-режиме.
Корпорация Microsoft также работает над созданием онлайн-версии Visual Studio Code, которая может работать в любом браузере, однако в настоящее время она доступна только в деморежиме. После релиза версия будет доступна всем по следующей ссылке: online.visualstudio.com.
1.3. Дополнительные ресурсы
Посетите следующие сайты, чтобы получить дополнительную информацию по темам, рассмотренным в этой главе:
• знакомство с .NET Core: dotnet.github.io;
• инструменты интерфейса командной строки (CLI) .NET Core: aka.ms/dotnet-cli-docs;
• CoreCLR, общеязыковая исполняющая среда .NET Core: github.com/dotnet/coreclr/;
• путеводитель по .NET Core: github.com/dotnet/core/blob/master/roadmap.md;
• часто задаваемые вопросы о .NET Standard: github.com/dotnet/standard/blob/master/docs/faq.md;
• Stack Overflow: stackoverflow.com;
• расширенный поиск Google: www.google.com/advanced_search;
• виртуальная академия Microsoft: mva.microsoft.com;
• Microsoft Channel 9: видеоуроки для разработчиков: channel9.msdn.com.
Резюме
В этой главе мы настроили среду разработки, обсудили различия между .NET Framework, .NET Core, Xamarin и .NET Standard, вы научились пользоваться средами разработки Visual Studio Code и .NET Core SDK для создания простого консольного приложения. Кроме того, вы узнали, как загрузить код решения из данной книги из репозитория GitHub и, что наиболее важно, научились находить справочную информацию.
В следующей главе вы научитесь изъясняться на языке C#.
2. Говорим на языке C#
Данная глава посвящена основам языка программирования C# — грамматике и терминологии, которыми вы будете пользоваться ежедневно при разработке своих приложений. Уже к концу главы вы будете чувствовать себя уверенно, зная, как временно хранить информацию в памяти вашего компьютера и работать с ней.
В этой главе:
• введение в C#;
• основы языка C#;
• работа с переменными;
• работа со значениями null;
• дальнейшее изучение консольных приложений.
Введение в C#
Данный раздел книги посвящен языку C# — грамматике и терминологии. Это то, что вы будете использовать каждый день для написания исходного кода своих приложений.
Языки программирования имеют много общего с человеческими, за исключением того, что в языках программирования вы можете создавать собственные слова, как доктор Сьюз!
В книге, написанной доктором Сьюзом в 1950 году, «Если бы у меня был свой зоопарк» есть следующие строки:
Что дальше? Хочу без затей
Поймать просто невероятных зверей,
Каких вы представить себе не могли,
В стране под названием Гдетовдали!
Смотрите: Махлышка, Павлюн и Свердец,
Носульщик, Уныльщик, Цветец-Размышлец!1
Обзор версий языка и их функций
Данный раздел книги посвящен языку программирования C# и написан скорее для начинающих, поэтому в нем рассматриваются основные темы, которые должны знать все разработчики: от объявления переменных до хранения данных и определения собственных пользовательских типов данных.
Такие сложные и непонятные темы, как переназначение локальной переменной ref и семантика ссылок с типами значений, не рассматриваются.
В этой книге представлены особенности языка C# от версии 1.0 до последней версии 8.0. Если вы уже знакомы с устаревшими версиями C# и желаете узнать о новых функциях в самых последних версиях C#, то ниже я привел список языковых версий и их важных новых функций, указав номер главы и название темы.
C# 1.0
Версия C# 1.0 была выпущена в 2002 году и включала в себя все важные функции статически типизированного объектно-ориентированного современного языка, как приведено во всех главах в первой части.
C# 2.0
Версия C# 2.0 была выпущена в 2005 году и была нацелена на обеспечение строгой типизации данных с использованием дженериков для повышения производительности кода и уменьшения количества ошибок типов, включая темы, перечисленные в табл. 2.1.
Таблица 2.1
| Особенность |
Глава |
Тема |
| Типы, допускающие значение null |
2 |
Создание значимого типа, допускающего значение null |
| Дженерики (обобщения) |
6 |
Создание типов, более пригодных для повторного использования с помощью дженериков |
C# 3.0
Версия C# 3.0 вышла в 2007 году и была направлена на включение декларативного программирования с помощью Language INtegrated Queries (LINQ) и связанных с ним функций, таких как анонимные типы и лямбда-выражения, включая темы, перечисленные в табл. 2.2.
Таблица 2.2
| Особенность |
Глава |
Тема |
| Неявно типизированные локальные переменные |
2 |
Определение типа локальной переменной |
| LINQ |
12 |
Все темы, рассматриваемые в главе 12 |
C# 4.0
Версия C# 4.0 была выпущена в 2010 году и фокусировалась на улучшении взаимодействия с динамическими языками, такими как F# и Python, включая темы, перечисленные в табл. 2.3.
Таблица 2.3
| Особенность |
Глава |
Тема |
| Динамические типы |
2 |
Тип dynamic |
| Именованные/необязательные аргументы |
5 |
Необязательные параметры и именованные аргументы |
C# 5.0
Версия C# 5.0 вышла в 2012 году и была направлена на упрощение поддержки асинхронных операций за счет автоматической реализации сложных конечных машин, включая темы, указанные в табл. 2.4.
Таблица 2.4
| Особенность |
Глава |
Тема |
| Упрощенные асинхронные методы |
13 |
Знакомство с методами async и await |
C# 6.0
Версия C# 6.0 была выпущена в 2015 году и ориентирована на незначительные детали языка, включая темы, перечисленные в табл. 2.5.
Таблица 2.5
| Особенность |
Глава |
Тема |
| static (статический импорт) |
2 |
Упрощение использования консоли |
| Интерполированные строки |
2 |
Отображение вывода для пользователя |
| Члены класса с телами в виде выражений |
5 |
Определение свойств только для чтения |
C# 7.0
Версия C# 7.0 была выпущена в марте 2017 года и сфокусирована на добавление функциональных языковых возможностей, таких как кортежи и сопоставление с образцом, а также незначительные уточнения языка, включая темы, перечисленные в табл. 2.6.
Таблица 2.6
| Особенность |
Глава |
Тема |
| Двоичные литералы и разделители цифр |
2 |
Хранение целых чисел |
| Сопоставление с образцом |
3 |
Сопоставление с образцом, используя оператор if |
| Переменные out |
5 |
Управление передачей параметров |
| Кортежи |
5 |
Объединение нескольких значений в кортеж |
| Локальные функции |
6 |
Определение локальных функций |
C# 7.1
Версия C# 7.1 вышла в августе 2017 года и была нацелена на незначительные изменения в языке, включая темы, перечисленные в табл. 2.7.
Таблица 2.7
| Особенность |
Глава |
Тема |
| Литеральные выражения по умолчанию |
5 |
Установка значений полей с использованием литералов по умолчанию |
| Автоматически определяемые имена элементов кортежа |
5 |
Вывод имен кортежей |
| Функция async Main |
13 |
Сокращение времени реагирования для консольных приложений |
C# 7.2
Версия C# 7.2 была выпущена в ноябре 2017 года и нацелена на незначительные уточнения в языке, включая темы, перечисленные в табл. 2.8.
Таблица 2.8
| Особенность |
Глава |
Тема |
| Начальное подчеркивание в числовых литералах |
2 |
Хранение целых чисел |
| Не завершающие именованные аргументы |
5 |
Необязательные параметры и именованные аргументы |
| Модификатор доступа private protected |
5 |
Описание модификаторов доступа |
| Операторы == и != с кортежами |
5 |
Сравнение кортежей |
C# 7.3
Версия C# 7.3 была выпущена в мае 2018 года и фокусировалась на ориентированном на производительность безопасном коде, который совершенствует переменные ref, указатели и stackalloc. Они редко нужны большинству разработчиков, поэтому не рассматриваются в книге.
Если вы заинтересовались, то можете получить более подробную информацию на сайте docs.microsoft.com/ru-ru/dotnet/csharp/whats-new/csharp-7-3.
C# 8.0
Версия C# 8.0 была выпущена в сентябре 2019 года и посвящена серьезному изменению языка, связанного с обработкой типов null, включая темы, перечисленные в табл. 2.9.
Таблица 2.9
| Особенность |
Глава |
Тема |
| Ссылочные типы, допускающие значение null |
2 |
Создание ссылочного типа, допускающего значение null |
| Выражение switch |
3 |
Упрощение операторов switch с помощью выражений switch |
| Методы интерфейса по умолчанию |
6 |
Описание методов интерфейса по умолчанию |
Подробную информацию о языке C# можно найти на сайте github.com/dotnet/roslyn/blob/master/docs/Language%20Feature%20Status.md.
Версии компилятора C#
С появлением поколения C# 7.x корпорация Microsoft решила ускорить выпуски релизов, поэтому впервые после версии C# 1.1 появились минорные номера версий.
Компиляторы языка .NET для языков C#, Visual Basic и F#, также известные как Roslyn, входят в состав пакета SDK .NET Core. Чтобы применить определенную версию C#, вы должны иметь установленную версию .NET Core SDK, одну из перечисленных в табл. 2.10.
Таблица 2.10
| .NET Core SDK |
Roslyn |
C# |
| 1.0.4 |
2.0–2.2 |
7.0 |
| 1.1.4 |
2.3–2.4 |
7.1 |
| 2.1.2 |
2.6–2.7 |
7.2 |
| 2.1.200 |
2.8–2.10 |
7.3 |
| 3.0 |
3.0–3.3 |
8.0 |
Более подробно с версиями можно ознакомиться на сайте github.com/dotnet/roslyn/wiki/NuGet-packages.
Посмотрим на имеющиеся версии компилятора языка C#.
1. Запустите программу Visual Studio Code.
2. Выберите View—>Terminal (Вид—>Терминал).
3. Для определения имеющейся версии .NET Core SDK введите следующую команду:
dotnet --version
4. Обратите внимание, что версия на момент написания — .NET Core 3.0, как показано в следующем выводе:
3.0.100
5. Для определения имеющейся версии компилятора C# введите следующую команду:
csc -langversion:?
6. Обратите внимание на все версии, доступные на момент написания:
Supported language versions:
default
1
2
3
4
5
6
7.0
7.1
7.2
7.3
8.0 (default)
latestmajor
preview
latest
Включение версии компилятора на определенном языке
Инструменты разработчика, такие как Visual Studio Code и интерфейс командной строки dotnet, предполагают, что вы хотите применять последнюю основную версию компилятора языка C# по умолчанию. Поэтому до выпуска версии C# 8.0 версия C# 7.0 была последней основной и использовалась по умолчанию. Чтобы задействовать обновления доработанных версий C#, таких как 7.1, 7.2 или 7.3, вам необходимо добавить элемент конфигурации в файл проекта следующим образом:
<LangVersion>7.3</LangVersion>
Если корпорация Microsoft выпустит компилятор версии C# 8.1 и вы захотите использовать его новые возможности, то вам придется добавить элемент конфигурации в файл проекта следующим образом:
<LangVersion>8.1</LangVersion>
Потенциальные значения для <LangVersion> показаны в табл. 2.11.
Таблица 2.11
| LangVersion |
Описание |
| 7, 7.1, 7.2, 7.3, 8 |
При вводе определенного номера версии данный компилятор будет использоваться, если был установлен |
| latestmajor |
Использует версию с наибольшим мажорным номером, например 7.0 в августе 2019 года, 8.0 в октябре 2019 года |
| latest |
Использует версию с наибольшими мажорным и минорным номерами, например 7.2 в 2017 году, 7.3 в 2018 году, 8 в 2019 году, возможно, 8.1 в 2020 году |
| preview |
Использует самую новую из доступных предварительных версий, например 8.0 в январе 2019 года с установленным .NET Core 3.0 Preview 1 |
После создания проекта с помощью инструмента командной строки dotnet вы можете отредактировать файл csproj и добавить элемент <LangVersion> следующим образом:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp3.0</TargetFramework>
<LangVersion>preview</LangVersion>
</PropertyGroup>
</Project>
Ваши проекты должны быть нацелены на netcoreapp3.0 или netstandard2.1, чтобы использовать все возможности языка C# 8.0.
Версия языка C#, используемая в вашем проекте, определяется целевым фреймворком, как описано на сайте devblogs.microsoft.com/dotnet/an-update-to-c-versions-and-c-tooling/.
Основы языка C#
В процессе изучения языка программирования C# вам нужно будет создать несколько простых приложений. В главах первой части этой книги будет использоваться простейший тип приложения — консольное.
Начнем с изучения основ грамматики и терминологии языка C#. В этой главе вы создадите несколько консольных приложений, каждое из которых будет демонстрировать возможности языка C#.
1. По завершении изучения главы 1 у вас уже будет папка Code в вашей пользовательской папке. В противном случае вам нужно ее создать.
2. Создайте вложенную папку Chapter02 с подпапкой Basics.
3. Запустите программу Visual Studio Code и откройте папку Chapter02/Basics.
4. В Visual Studio Code выберите View—>Terminal (Вид—>Терминал) и введите следующую команду:
dotnet new console
5. На панели EXPLORER (Проводник) выберите файл Program.cs, а затем нажмите кнопку Yes (Да), чтобы добавить недостающие обязательные ресурсы.
Грамматика языка C#
К грамматике языка C# относятся операторы и блоки. Вы также можете оставлять пояснения к своему коду с помощью комментариев.
Написание комментариев никогда не должно выступать в качестве единственного способа документирования вашего кода. Для этой цели дополнительно можно прибегнуть к выбору понятных имен для переменных и функций, написанию модульных тестов и созданию настоящих документов.
Операторы
В русском языке мы обозначаем конец повествовательного предложения точкой. Предложение может состоять из разного количества слов и фраз. Порядок слов в предложении тоже относится к правилам грамматики. К примеру, по-русски мы обычно говорим «черный кот», но в определенных случаях допустимо сказать и «кот черный».
В английском языке прилагательное «черный» всегда предшествует существительному «кот»: the black cat. Во французском языке порядок иной; прилагательное указывается после существительного: le chat noir. Порядок имеет значение.
Язык C# обозначает конец оператора точкой с запятой. При этом оператор может состоять из нескольких переменных и выражений. Например, для следующего оператора totalPrice — это переменная, аsubtotal+salesTax — выражение:
var totalPrice = subtotal + salesTax;
Выражение состоит из операнда subtotal, операции + и второго операнда salesTax. Порядок операндов и операторов имеет значение.
Комментарии
Для описания предназначения кода вы можете добавлять комментарии, предваряя их двумя символами косой черты: //. Компилятор игнорирует любой текст после этих символов и до конца строки, например:
// налог с продаж должен быть добавлен к промежуточной сумме
var totalPrice = subtotal + salesTax;
Среда разработки Visual Studio Code позволяет добавлять и удалять комментарии (двойная косая черта) в начале выбранной строки с помощью сочетаний клавиш Ctrl+K+C и Ctrl+K+U. В операционной системе macOS вместо клавиши Ctrl используйте клавишу Cmd.
Для оформления многострочного комментария используйте символы /* в начале комментария и */ в его конце, как показано в коде ниже.
/*
Это многострочный
комментарий.
*/
Блоки
В русском языке мы обозначаем абзацы, начиная последующий текст с новой строки. В языке C# блоки кода заключаются в фигурные скобки: {}. Каждый блок начинается с объявления, описывающего то, что мы определяем. К примеру, блок может определять пространство имен, класс, метод или оператор. Со всем этим мы разберемся позднее.
Обратите внимание: в текущем проекте грамматика языка C# уже написана с помощью инструмента командной строки dotnet. В следующем примере я добавлю несколько комментариев для описания кода.
using System; // точка с запятой указывает на конец оператора
namespace Basics
{
class Program
{
static void Main(string[] args)
{ // начало блока
Console.WriteLine("Hello World!"); // оператор
}// конец блока
}
}
Терминология языка C#
Терминологический словарь языка C# состоит из ключевых слов, символов и типов.
Среди предопределенных, зарезервированных ключевых слов можно выделить using, namespace, class, static, int, string, double, bool, if, switch, break, while, do, for и foreach.
А вот некоторые из символов: ", ', +, -, *, /, %, @ и $.
По умолчанию Visual Studio Code выделяет ключевые слова C# синим цветом, чтобы их было легче отличить от другого кода. Программа позволяет настроить цветовую схему.
1. В Visual Studio Code выберите Code—>Preferences—>Color Theme (Код—>Параметры—>Цветовая схема) (находится в меню File (Файл) в операционной системе Windows) или нажмите сочетание клавиш Ctrl+K, Ctrl+T или Cmd+K, Cmd+T.
2. Выберите цветовую схему. Для справки: я буду использовать цветовую схему Light+ (по умолчанию Light), чтобы снимки экрана выглядели четко в напечатанной книге.
Существуют и другие контекстные ключевые слова, имеющие особое значение только в определенном контексте. В языке C# около 100 ключевых слов.
В английском языке более 250 тыс. различных слов. Каким же образом языку C# справиться, располагая только сотней ключевых слов? Более того, почему C# так трудно выучить, если он содержит всего 0,0416 % слов по сравнению с количеством в английском языке?
Одно из ключевых различий между человеческим языком и языком программирования заключается в том, что разработчики должны иметь возможность определять новые «слова» с новыми значениями. Помимо 104 ключевых слов на языке C#, эта книга научит вас некоторым из сотен тысяч «слов», определенных другими разработчиками, но вы также узнаете, как определять собственные.
Программисты во всем мире должны изучать английский язык, поскольку большинство языков программирования используют английские слова, такие как namespace и class. Существуют языки программирования, использующие другие человеческие языки, такие как арабский, но они считаются редкими. Если вы заинтересованы в обучении, то можете посмотреть видеоуроки на YouTube, демонстрирующие процесс программирования на арабском языке: youtu.be/dkO8cdwf6v8.
Помощь с написанием правильного кода
Простые текстовые редакторы, например приложение Notepad (Блокнот), не помогут правильно писать на английском языке. Аналогичным образом это приложение также не поможет вам написать правильный код на языке C#.
Программа Microsoft Word помогает писать без ошибок, подчеркивая ошибки волнистой линией: орфографические — красной (например, icecream следует писать ice-cream или ice cream), а грамматические — синей (например, если предложение должно начинаться с прописной буквы в первом слове).
Расширение C# для Visual Studio Code постоянно отслеживает, как вы набираете код, выделяя орфографические и грамматические ошибки с помощью цветных волнистых линий, аналогично Microsoft Word. Например, имя метода WriteLine должно писаться с заглавной буквой L, а операторы — заканчиваться точкой с запятой.
Рассмотрим вышесказанное на примере.
1. В файле Program.cs замените в методе WriteLine прописную букву L на строчную.
2. Удалите точку с запятой в конце оператора.
3. Выберите View—>Problems (Вид—>Проблемы) либо нажмите сочетание клавиш Ctrl+Shift+M или Cmd+Shift+M и обратите внимание, что ошибки кода подчеркиваются красной волнистой линией, а подробная информация отображается на панели PROBLEMS (Проблемы), как показано на рис. 2.1.
Рис. 2.1
4. Исправьте две ошибки в коде.
Глаголы = методы
В русском языке глаголы используются для описания действия. В языке C# действия называются методами, и их в нем доступны буквально сотни тысяч. В русском языке глаголы меняют форму в зависимости от времени: действие происходило, происходит или будет происходить. К примеру, Амир попрыгал в прошлом, Бет прыгает в настоящем, они прыгали в прошлом и Чарли будет прыгать в будущем.
В языке C# вызов или выполнение методов, таких как WriteLine, различаются в зависимости от специфики действия. Это так называемая перегрузка, которую мы более подробно изучим в главе 5. Рассмотрим следующий пример:
// выводит возврат каретки
Console.WriteLine();
// выводит приветствие и возврат каретки
Console.WriteLine("Hello Ahmed");
// выводит отформатированное число и дату и возврат каретки
Console.WriteLine("Temperature on {0:D} is {1}°C.", DateTime.Today, 23.4);
Другая аналогия заключается в том, что некоторые слова пишутся одинаково, но имеют разные значения в зависимости от контекста.
Существительные = типы данных, поля и переменные
В русском языке существительные — это названия предметов или живых существ. К примеру, Шарик — имя (кличка) собаки. Словом «собака» называется тип живого существа с именем Шарик. Скомандовав Шарику принести мяч, мы используем его имя и название предмета, который нужно принести.
В языке C# используются эквиваленты существительных: типы данных (чаще называемые просто типами), поля и переменные. Например, Animal и Car — типы, то есть существительные для категоризации предметов. Head и Engine — поля, то есть существительные, которые принадлежат Animal и Car. В то время как Fido и Bob — переменные, то есть существительные, относящиеся к конкретному предмету.
Для языка C# доступны десятки тысяч типов. Обратите внимание: я сказал не «В языке C# доступны десятки тысяч типов». Разница едва уловимая, но весьма важная. Язык C# содержит лишь несколько ключевых слов для типов данных, например string и int. Строго говоря, C# не определяет какие-либо типы. Ключевые слова наподобие string определяют типы как псевдонимы, представляющие типы на платформе, на которой запускается C#.
C# не может работать независимо. Это язык приложений, запускаемых на разных платформах .NET. Теоретически можно написать компилятор C# под другую платформу, с другими базовыми типами. На практике платформа для C# — одна из платформ .NET. Это платформа .NET, предоставляющая десятки тысяч типов для C#. Они включают System.Int32, к которым относится ключевое слово-псевдоним int языка C#, и более сложные типы, такие как System.Xml.Linq.XDocument.
Обратите внимание: термин «тип» часто путают с «классом». Существует такая игра, «20 вопросов», в которой первым делом спрашивается категория загаданного предмета: «животное», «растение» или «минерал»? В языке C# каждый тип может быть отнесен к одной из категорий: class (класс), struct (структура), enum (перечисление), interface (интерфейс) или delegate (делегат). В языке C# ключевое слово string — это class (класс), но int — это struct (структура). Поэтому лучше использовать термин «тип» для обозначения их обоих.
Подсчет количества типов и методов
Мы знаем, что в языке C# существует более 100 ключевых слов, но сколько типов? В нашем простом консольном приложении напишем код, позволяющий подсчитать количество типов и методов, доступных в языке C#.
Не волнуйтесь, если не понимаете, как работает этот код. В нем используется техника под названием «отражение».
1. Начнем с добавления следующих операторов в начале файла Program.cs:
using System.Linq;
using System.Reflection;
2. В методе Main удалите оператор, выводящий текст HelloWorld!, и замените его кодом, который показан ниже:
// перебор сборок, на которые ссылается приложение
foreach (var r in Assembly.GetEntryAssembly()
.GetReferencedAssemblies())
{
// загрузка сборки для чтения данных
var a = Assembly.Load(new AssemblyName(r.FullName));
// объявление переменной для подсчета методов
int methodCount = 0;
// перебор всех типов в сборке
foreach (var t in a.DefinedTypes)
{
// добавление количества методов
methodCount += t.GetMethods().Count();
}
// вывод количества типов и их методов
Console.WriteLine(
"{0:N0} types with {1:N0} methods in {2} assembly.",
arg0: a.DefinedTypes.Count(),
arg1: methodCount,
arg2: r.Name);
}
3. Выберите View—>Terminal (Вид—>Терминал).
4. На панели TERMINAL (Терминал) введите следующую команду:
dotnet run
5. Когда эта команда будет выполнена, вы увидите следующий вывод, в котором отображается фактическое количество типов и методов, доступных вам в простейшем приложении при работе в операционной системе macOS. Количество отображаемых типов и методов может отличаться в зависимости от используемой операционной системы, как показано ниже:
30 types with 325 methods in System.Runtime assembly.
99 types with 1,068 methods in System.Linq assembly.
56 types with 691 methods in System.Console assembly.
6. Добавьте операторы в начало метода Main, чтобы объявить некоторые переменные, как показано ниже:
static void Main(string[] args)
{
// объявление некоторых неиспользуемых переменных
// с помощью типов в дополнительных сборках
System.Data.DataSet ds;
System.Net.Http.HttpClient client;
Из-за объявления переменных, использующих типы в других сборках, эти сборки загружаются с приложением, что позволяет коду видеть все типы и методы в них. Компилятор предупредит вас о наличии неиспользуемых переменных, но это не остановит выполнение вашего кода.
7. Снова запустите консольное приложение и проанализируйте результаты. Они должны выглядеть примерно так:
30 types with 325 methods in System.Runtime assembly.
371 types with 6,735 methods in System.Data.Common assembly.
406 types with 4,228 methods in System.Net.Http assembly.
99 types with 1,068 methods in System.Linq assembly.
56 types with 691 methods in System.Console assembly.
Надеюсь, теперь вы понимаете, почему изучение языка C# — та еще задача. Типов и методов множество, причем методы — только одна категория членов, которую может иметь тип, а программисты постоянно определяют новые члены!
Работа с переменными
Любое приложение занимается обработкой данных. Они поступают, обрабатываются и выводятся. Обычно данные поступают в программы из файлов, баз данных или через пользовательский ввод. Данные могут быть на время помещены в переменные, которые хранятся в памяти работающей программы. Когда она завершается, данные стираются из памяти. Данные обычно выводятся в файлы и базы, на экран или принтер. При использовании переменных вы должны учитывать два фактора. Во-первых, как много объема памяти им требуется, и, во-вторых, насколько быстро их можно обработать.
Вы можете управлять этими характеристиками, выбрав определенный тип. Простые распространенные типы, например int и double, можно представить как хранилище разного размера. Например, добавление 16-битных чисел может обрабатываться не так быстро, как добавление 64-битных чисел в 64-битной операционной системе. Некоторые хранилища можно разместить поближе, для быстрого доступа, а другие — убрать подальше в большое хранилище.
Присвоение переменным имен
Теперь обсудим правила именования переменных, которым рекомендуется следовать. Взгляните на табл. 2.12.
Таблица 2.12
| Правило |
Примеры |
Использование |
| Верблюжий регистр |
cost, orderDetail, dateOfBirth |
Локальные переменные и закрытые члены |
| Прописной стиль |
String, Int32, Cost, DateOfBirth, Run |
Имена типов, открытые члены, такие как методы |
Следование набору соглашений об именах переменных позволит другим разработчикам (и вам самим в будущем!) легко понять ваш код.
Дополнительную информацию о правилах присвоения имен переменным можно найти на сайте docs.microsoft.com/ru-ru/dotnet/standard/design-guidelines/naming-guidelines.
Блок кода, показанный ниже, отражает пример объявления и инициализации локальной переменной путем присвоения ей значения с символом =. Обратите внимание: вы можете вывести имя переменной, используя ключевое слово nameof, появившееся в версии C# 6.0:
// присвоение переменной значения, равного 1,88
double heightInMetres = 1.88;
Console.WriteLine($"The variable {nameof(heightInMetres)} has the value {heightInMetres}.");
Сообщение в двойных кавычках в предыдущем фрагменте кода было перенесено на вторую строку, поскольку страница этой книги слишком узкая. При вводе подобных операторов в окне редактора кода набирайте их в одну строку.
Литеральные значения
При присвоении значения переменной часто используются литеральные значения. Что это такое? Литералами обозначаются фиксированные значения. Типы данных используют разные обозначения для их литеральных значений, и в следующих нескольких разделах вы изучите примеры применения литеральных нотаций для присвоения значений переменным.
Хранение текста
При работе с текстом отдельная буква, например A, сохраняется как тип char и присваивается с использованием одинарных кавычек, оборачивающих литеральное значение:
char letter = 'A'; // присваивание литеральных символов
char digit = '1';
char symbol = '$';
char userChoice = GetKeystroke(); // присваивание из функции
Если же используется последовательность символов, например слово Bob, то такое значение сохраняется как тип string и присваивается с использованием двойных кавычек, оборачивающих литеральное значение:
string firstName = "Bob"; // присваивание литеральных строк
string lastName = "Smith";
string phoneNumber = "(215) 555-4256";
// присваивание строки, возвращаемой функцией
string address = GetAddressFromDatabase(id: 563);
Дословные литеральные строки
При сохранении текста в строковой переменной вы можете включить escape-последовательности, которые представляют собой специальные символы, такие как табуляции и новые строки. Это можно сделать с помощью обратного слеша:
string fullNameWithTabSeparator = "Bob\tSmith";
