Академический Документы
Профессиональный Документы
Культура Документы
1
УДК 004.43
Г85
Гриффитс Иэн
Г85 Программируем на C# 8.0. Разработка приложений. — СПб: Питер, 2021. —
944 с.: ил. — (Серия «Бестселлеры O’Reilly»).
ISBN 978-5-4461-1638-6
C# —универсальный язык, который может практически всё! Иэн Гриффитс рассказывает
о его возможностях с точки зрения разработчика, перед которым стоит задача быстро и эффек-
тивно создавать приложения любой сложности. Множество примеров кода научат работать
с шаблонами, LINQ и асинхронными возможностями языка. Вы разберетесь с асинхронными
потоками, ссылочными типами, допускающими значение NULL, сопоставлениями с образцом,
реализациями по умолчанию для метода интерфейса, диапазонами и синтаксисом индексации
и многим другим.
ББК 32.973.2-018.1
УДК 004.43
Права на издание получены по соглашению с O’Reilly. Все права защищены. Никакая часть данной книги
не может быть воспроизведена в какой бы то ни было форме без письменного разрешения владельцев
авторских прав.
ISBN 978-1492056812 англ. Authorized Russian translation of the English edition of Programming C# 8.0
ISBN 9781492056812 © 2020 Ian Griffiths
This translation is published and sold by permission of O’Reilly Media, Inc.,
which owns or controls all rights to publish and sell the same
ISBN 978-5-4461-1638-6 © Перевод на русский язык ООО Издательство «Питер», 2021
© Издание на русском языке, оформление
ООО Издательство «Питер», 2021
© Серия «Бестселлеры O’Reilly», 2021
Оглавление
Предисловие.............................................................................................. 12
Для кого эта книга.......................................................................................12
Условные обозначения.................................................................................12
Использование примеров кода.....................................................................13
Благодарности..............................................................................................14
От издательства...........................................................................................15
Об обложке.............................................................................................. 939
ГЛАВА 1
Знакомство с языком C#
1
Все это было верно и в отношении предыдущего кросс-платформенного предложения
Microsoft, а именно .NET. В 2008 году Microsoft выпустила Silverlight 2.0, который
позволял C# работать в браузерах на Windows и macOS. Silverlight проигрывал битву
со все растущими возможностями и универсальным охватом HTML5 и JavaScript,
и его закрытый исходный код никак не помогал его делу.
Почему C#? 17
Почему C#?
Хотя для C# существует множество сценариев использования, всегда есть
и другие языки программирования. Почему же стоит выбрать среди них
C#? Этот выбор зависит от того, что именно требуется сделать, а также
от того, что вам нравится или не нравится в том или ином языке програм-
мирования. Я считаю, что C# предоставляет значительные возможности,
гибкость и производительность и работает на достаточно высоком уровне
абстракции, из-за чего не приходится тратить огромные усилия на мелкие
детали, не связанные напрямую с задачей, которую призвана решать моя
программа.
Большая часть мощи C# обусловлена методами программирования, которые
поддерживает язык. Например, в нем имеются объектно-ориентированные
функции, обобщения и функциональное программирование. Он поддержи-
вает как динамическую, так и статическую типизацию. Он обеспечивает
мощные функции, ориентированные на списки и множества, благодаря
языку интегрированных запросов (LINQ). Он имеет встроенную поддержку
асинхронного программирования.
В последнее время C# приобрел гибкость в управлении памятью. Среда
выполнения всегда предоставляла сборщик мусора (GC), освобождающий
разработчиков от значительной части работы, связанной с освобождением
памяти, которую программа больше не использует. GC — это распространен-
ная функция в современных языках программирования, и хотя она является
благом для большинства случаев, существуют некоторые особые сценарии,
в которых ее влияние на производительность — это проблема. Поэтому
в C# 7.2 (выпущен в 2017 году) добавлены различные функции, которые
позволяют более явно управлять памятью, что дает возможность обменять
простоту разработки на производительность во время выполнения, но все
это без потери безопасности типов. Это дает возможность создавать на C#
приложения, для которых критична производительность, что годами было
прерогативой менее безопасных языков, таких как С и С++.
Конечно, языки программирования не живут в изоляции, и им нужны
высококачественные библиотеки с широким спектром возможностей. Не-
18 Глава 1. Знакомство с языком C#
Отличительные черты С#
Хотя внешне наиболее очевидной особенностью C# является свойственный
семейству C синтаксис, возможно, более примечательно то, что он был
первым языком, разработанным специально для использования в среде
выполнения CLR. Как следует из названия, CLR достаточно гибок для под-
держки множества языков. Однако есть важное различие между языком,
который был расширен для поддержки CLR, и языком, который создан для
работы в CLR. Это можно увидеть на примере расширений .NET в компи-
ляторе C++ Microsoft: синтаксис использования этих функций заметно
отличается от стандартного C++, что показывает четкое различие между
собственно средой C++ и внешней средой CLR. Но даже отсутствие отличий
в синтаксисе2 не гарантирует разногласий, когда две среды будут работать
по-разному. Например, если вам нужна коллекция чисел с динамическим
изменением размера, то какой класс коллекции в C++ следует использовать:
такой как vector<int> или один из .NET, например List<int>? Какой бы из
них вы ни выбрали, он не всегда будет правильным решением: библиотеки
С++ не будут знать, что делать с коллекцией .NET, тогда как API .NET не
смогут использовать тип из C++.
C# поддерживает и среду выполнения .NET, и библиотеку классов, поэтому
таких дилемм не возникает. В только что рассмотренном сценарии List<int>
3
Исключением является .NET Native: он не поддерживает JIT, поэтому там отсутствует
многоуровневая компиляция.
22 Глава 1. Знакомство с языком C#
Стандарты и реализация C#
Прежде чем приступить к рассмотрению реального кода, нужно выяснить, на
какую реализацию C# и на какую среду выполнения ориентироваться. Есть
спецификации, которые определяют язык и поведение во время выполнения
24 Глава 1. Знакомство с языком C#
для всех реализаций C#, как описано во врезке «C#, CLR и стандарты».
Это сделало возможным появление нескольких реализаций C# и среды
выполнения. На момент написания книги наиболее широко распростране-
ны три из них: .NET Framework, .NET Core и Mono. Путаницу вносит то,
что за всеми тремя стоит Microsoft, но стоит сказать, что изначально все
планировалось не так.
Таким образом, можно сказать, что реализация CLI от Microsoft — это скорее .NET,
нежели просто CLR, хотя .NET включает в себя множество дополнительных функ-
ций, не входящих в спецификацию CLI. (Например, библиотека классов, которую
требует CLI, составляет лишь небольшое подмножество гораздо более крупной
библиотеки .NET.) CLR фактически является VES для .NET, но вы вряд ли когда-
либо увидите термин VES, используемый вне спецификации, почему в этой книге
я в основном и говорю о CLR (или просто среде выполнения). Понятия CTS и CLS
используются более широко, и я еще вернусь к ним в этой книге.
Стандарты и реализация C# 25
Как ни странно, этот самый первый релиз с поддержкой UWP в 2015 году, по-
4
видимому, так и не получил официального номера версии. Выпуск .NET Core 1.0
датируется июнем 2016 года, т. е. примерно через год.
Стандарты и реализация C# 27
10 ноября 2020 года действительно была выпущена .NET 5.0. — Примеч. ред.
5
28 Глава 1. Знакомство с языком C#
Core, .NET Framework, Mono), но и версия (например, .NET Core 2.2 или 3.0,
.NET Framework 4.7.2 или 4.8). И есть более старые варианты .NET, такие
как Windows Phone или Silverlight, — Microsoft по-прежнему поддерживает
многие из них, включая постоянную поддержку через различные библиотеки
в NuGet. Многие авторы популярных пакетов с открытым исходным кодом,
распространяемых через NuGet, также поддерживают множество старых
типов и версий платформы.
Первоначально люди справлялись с проблемой версий, создавая несколько
вариантов своих библиотек. Когда вы распространяете библиотеки .NET
через NuGet, то можете встраивать в пакет несколько наборов двоичных
файлов, ориентированных на разные .NET. Тем не менее одна из основных
проблем заключается в том, что по мере появления новых форм .NET суще-
ствующие на протяжении многих лет библиотеки не будут работать во всех
новых средах выполнения. Компонент, написанный для .NET Framework 4.0,
будет работать на всех последующих версиях .NET Framework, но не на .NET
Core. Даже если исходный код компонента полностью совместим с .NET Core,
вам потребуется отдельная версия, скомпилированная для этой платформы.
И если автор используемой вами библиотеки не добавил явную поддержку
.NET Core, это помешает ее использовать. Это плохо для всех. Авторы ком-
понентов встали перед необходимостью создавать новые варианты своих
компонентов, и поскольку это зависит от того, есть ли у авторов желание
и время на эту работу, пользователи сталкиваются с тем, что не все компо-
ненты, которые они хотят применить, доступны на нужной им платформе.
Чтобы избежать этого, Microsoft представила .NET Standard, который
определяет общие подмножества поверхности API библиотеки классов .NET.
Если пакет NuGet нацелен, скажем, на .NET Standard 1.0, это гарантирует, что
он сможет работать на .NET Framework версий 4.5 или новее, .NET Core 1.0
или новее или Mono 4.6 или новее. И что очень важно, в случае появления
очередного варианта .NET существующие компоненты будут работать без
изменений, даже если эта новая платформа еще не существовала на момент
написания. Это истинно до тех пор, пока новый вариант поддерживает .NET
Standard 1.0.
Для обеспечения самого широкого охвата библиотеки .NET, опублико-
ванные в NuGet, должны ориентироваться на самую низкую версию .NET
Standard из возможных. Версии с 1.1 по 1.6 постепенно добавили больше
функциональности в обмен на поддержку меньшего диапазона платформ.
(Например, если вы хотите использовать компонент .NET Standard 1.3