Опубликовано

Вышла книга : “Qt 6.9. Профессиональное программирование на C++”

Qt 6.9. Профессиональное программирование на C++

Книга посвящена разработке приложений для Windows, macOS, Linux и iOS с использованием библиотеки Qt версии 6.9. Подробно рассмотрены возможности, предоставляемые этой библиотекой, и описаны особенности, выгодно отличающие ее от других библиотек. Описана интегрированная среда разработки Qt Creator и работа с технологией Qt Quick. Книга содержит исчерпывающую информацию о классах Qt 6, и даны практические рекомендации их применения, проиллюстрированные на большом количестве подробно прокомментированных примеров. Отдельно освещена тема искусственного интеллекта и показано, как использовать Qt 6 в эпоху ИИ: от управления ИИ-агентами до промт-инжиниринга с применением облачных и локальных моделей. Проекты и примеры из книги, дополнительные и редко востребованные главы в цифровом формате размещены на сайте издательства.

 Для программистов

 

Платформно-независимая реализация приложений — это уже сегодняшний и завтрашний день программной индустрии. И эта книга станет вашим надежным путеводителем в эру Qt 6 и ИИ-разработки.

 

Книга подробно знакомит с библиотекой Qt 6.9, являющейся не только средством для создания пользовательских интерфейсов, но и позволяющей разрабатывать приложения практически любой сложности.
Недаром Qt широко используется многими организациями и компаниями, такими как Adobe, Amazon, AMD, Bosch, BMW, Canon, Cisco Systems, Disney, Intel, IBM, Panasonic, Parallels, Pioneer, Philips, Oracle, HP,  Google, Mercedes Benz, NASA, NEC, Neonway, Nokia, Rakuten, Samsung, Siemens, Sony, SUN, Tesla, Xerox, Xilinx, Yamaha и др.

Если вы хотите идти в ногу со временем, то вам без этой книги просто не обойтись, поскольку она является исчерпывающим пособием по созданию программ на Qt 6 с использованием C++ и QML.

  • Кросс-платформенная реализация приложений для Windows, macOS и Linux
  • ИИ-ассистенты, ИИ-IDE, промт-инжиниринг и агентные рабочие процессы: архитектура, код, тесты c локальными и облачными моделями
  • Разработка мобильных приложений для iOS
  • Программирование 2D- и 3D-графики, мультимедиа, веб-приложений, баз данных, сети, таймера, многопоточности, XML, QML и JavaScript
  • Среда разработки Qt Creator и работа с технологией Qt Quick
  • 240 завершенных программ и 16 практичных промптов для разработки с ИИ
Макс Шлее

Макс Шлее (Max Schlee) — закончил Университет прикладных наук в городе Кайзерлаутерн (Германия). Сооснователь компании Neonway по разработке программного обеспечения на Qt. Работал разработчиком программного обеспечения в фирмах THOMSON, Grass Valley, DigitalFilmTechnology, Goober Ltd. и Advancis. Эксперт в области объектно-ориентированного проектирования, специализирующийся на C++ и Qt. Создатель более 50 программ и приложений для Windows, macOS, iOS и Android. Увлечено занимается проектами в области программирования графики, звука и анализа финансовых рынков. Является автором ряда статей, научных докладов на международных конференциях по генеративному программированию пользовательского интерфейса. С 2022 года активно интегрирует современные ИИ-инструменты в процесс разработки: от архитектуры ПО до создания UI/UX прототипов, автоматизации тестирования и генерации контента. Автор книг «Qt 3/4/4.5/4.8/5.3/5.10. Профессиональное программирование на C++» и др. Связаться с автором можно по адресу электронной почты Max.Schlee@neonway.com или через страницу информационной поддержки книги www.qt-book.com.

Книгу “Qt 6.9. Профессиональное программирование на C++” можно купить в нашем интенет-магазине.

Предисловие Маттиаса Эттриха к первому изданию……………………………… 26

Благодарности……………………………………………………………………………………….. 28

Предисловие автора……………………………………………………………………………….. 29

Структура книги………………………………………………………………………………………………………………………… 30

Часть I. Основы Qt……………………………………………………………………………………………………………… 30

Часть II. Элементы управления………………………………………………………………………………………… 31

Часть III. События и взаимодействие с пользователем………………………………………………….. 32

Часть IV. Графика и звук…………………………………………………………………………………………………… 32

Часть V. Создание приложений………………………………………………………………………………………… 33

Часть VI. Особые возможности Qt……………………………………………………………………………………. 34

Часть VII. Язык сценариев JavaScript………………………………………………………………………………. 35

Часть VIII. Технология Qt Quick……………………………………………………………………………………….. 36

Часть IX. Мобильные приложения и Qt……………………………………………………………………………. 37

Часть X. Qt и ИИ…………………………………………………………………………………………………………………. 37

Приложения………………………………………………………………………………………………………………………… 38

Файловый архив…………………………………………………………………………………………………………………. 38

Введение………………………………………………………………………………………………… 39

Часть I. Основы Qt…………………………………………………………………………. 51

Глава 1. Обзор иерархии классов Qt………………………………………………………. 52

Первая программа на Qt……………………………………………………………………………………………………………. 52

Модули Qt…………………………………………………………………………………………………………………………………… 53

Пространство имен Qt……………………………………………………………………………………………………….. 55

Модуль QtCore…………………………………………………………………………………………………………………… 55

Модуль QtGui……………………………………………………………………………………………………………………… 56

Модуль QtWidgets………………………………………………………………………………………………………………. 56

Модули QtQuick и QtQML………………………………………………………………………………………………….. 58

Модуль QtNetwork……………………………………………………………………………………………………………… 58

Модули QtXml…………………………………………………………………………………………………………………….. 58

Модуль QtSql……………………………………………………………………………………………………………………… 58

Модули QtMultimedia и QtMultimediaWidgets…………………………………………………………………. 58

Модуль QtSvg……………………………………………………………………………………………………………………… 59

Дополнительные модули Qt……………………………………………………………………………………………………… 59

Резюме…………………………………………………………………………………………………………………………………………. 60

Глава 2. Философия объектной модели………………………………………………….. 61

Механизм сигналов и слотов……………………………………………………………………………………………………. 64

Сигналы………………………………………………………………………………………………………………………………. 67

Слоты………………………………………………………………………………………………………………………………….. 69

Соединение объектов…………………………………………………………………………………………………………. 70

Новый синтаксис соединений………………………………………………………………………………….. 70

Классический синтаксис соединений……………………………………………………………………… 70

Разъединение объектов……………………………………………………………………………………………………… 75

Переопределение сигналов……………………………………………………………………………………………….. 76

Организация объектных иерархий…………………………………………………………………………………………… 77

Метаобъектная информация…………………………………………………………………………………………………….. 80

Резюме…………………………………………………………………………………………………………………………………………. 80

Глава 3. Работа с Qt……………………………………………………………………………….. 82

Интегрированная среда разработки………………………………………………………………………………………… 82

Программа Qt Assistant……………………………………………………………………………………………………………… 82

Работа с системами сборки………………………………………………………………………………………………………. 84

Работа с CMake………………………………………………………………………………………………………………….. 84

Работа с qmake…………………………………………………………………………………………………………………… 85

Как перейти с qmake на CMake в Qt 6?……………………………………………………………………………. 87

Рекомендации для проекта с Qt………………………………………………………………………………………………… 88

Метаобъектный компилятор MOC…………………………………………………………………………………………… 89

Компилятор ресурсов RCC……………………………………………………………………………………………………….. 90

Структура Qt-проекта……………………………………………………………………………………………………………….. 91

Методы отладки………………………………………………………………………………………………………………………… 91

Прочие методы отладки…………………………………………………………………………………………………….. 92

Глобальные определения Qt…………………………………………………………………………………………………….. 96

Информация о библиотеке Qt……………………………………………………………………………………………………. 97

Резюме…………………………………………………………………………………………………………………………………………. 98

Глава 4. Библиотека контейнеров………………………………………………………… 100

Контейнерные классы……………………………………………………………………………………………………………… 101

Итераторы………………………………………………………………………………………………………………………………… 103

Итераторы в стиле Java…………………………………………………………………………………………………… 103

Итераторы в стиле STL……………………………………………………………………………………………………. 104

Современный стиль итерации с range-based for……………………………………………………………. 105

Использование алгоритмов STL с лямбдами…………………………………………………………………. 106

Ключевое слово foreach………………………………………………………………………………………………….. 106

Последовательные контейнеры……………………………………………………………………………………………… 107

Массив байтов: класс QByteArray…………………………………………………………………………. 108

Массив битов: класс QBitArray……………………………………………………………………………… 109

Списки QList<T>………………………………………………………………………………………………………………. 109

Стек: класс QStack<T>……………………………………………………………………………………………………. 110

Очередь: класс QQueue<T>…………………………………………………………………………………………….. 111

Ассоциативные контейнеры……………………………………………………………………………………………………. 112

Словари QMap<K,T> и QMultiMap<K,T>…………………………………………………………………….. 112

Хеши QHash<K,T> и QMultiHash<K,T>………………………………………………………………………… 114

Множество QSet<T>………………………………………………………………………………………………………… 115

Алгоритмы………………………………………………………………………………………………………………………………… 116

Сортировка……………………………………………………………………………………………………………………….. 117

Поиск…………………………………………………………………………………………………………………………………. 118

Сравнение…………………………………………………………………………………………………………………………. 118

Заполнение значениями…………………………………………………………………………………………………… 118

Копирование значений элементов………………………………………………………………………………….. 119

Подсчет значений…………………………………………………………………………………………………………….. 119

Строки………………………………………………………………………………………………………………………………………. 119

Регулярные выражения……………………………………………………………………………………………………. 121

Произвольный тип: класс QVariant………………………………………………………………………………………… 124

Модель общего использования данных………………………………………………………………………………… 125

Резюме………………………………………………………………………………………………………………………………………. 126

Часть II. Элементы управления………………………………………………. 127

Глава 5. С чего начинаются элементы управления?…………………………….. 128

Класс QWidget………………………………………………………………………………………………………………………….. 128

Размеры и координаты виджета……………………………………………………………………………………… 131

Механизм закулисного хранения…………………………………………………………………………………… 132

Установка фона виджета…………………………………………………………………………………………………. 132

Изменение указателя мыши…………………………………………………………………………………………….. 133

Стек виджетов………………………………………………………………………………………………………………………….. 136

Рамки…………………………………………………………………………………………………………………………………………. 136

Виджет видовой прокрутки…………………………………………………………………………………………………….. 137

Резюме………………………………………………………………………………………………………………………………………. 139

Глава 6. Управление автоматическим размещением элементов……………. 141

Менеджеры компоновки (layout managers)……………………………………………………………………………. 141

Горизонтальное и вертикальное размещение……………………………………………………………….. 143

Класс QBoxLayout…………………………………………………………………………………………………… 143

Горизонтальное размещение QHBoxLayout…………………………………………………………. 145

Вертикальное размещение QVBoxLayout……………………………………………………………… 146

Вложенные размещения………………………………………………………………………………………………….. 147

Табличное размещение QGridLayout……………………………………………………………………………… 148

Размещение в виде формы: класс QFormLayout…………………………………………………………….. 153

Порядок следования табулятора……………………………………………………………………………………………. 154

Разделители: класс QSplitter…………………………………………………………………………………………………… 155

Резюме………………………………………………………………………………………………………………………………………. 156

Глава 7. Элементы отображения…………………………………………………………… 158

Надписи……………………………………………………………………………………………………………………………………. 158

Управление выравниванием текста……………………………………………………………………………….. 158

Отображение HTML-содержимого………………………………………………………………………………… 159

Отображение графической информации……………………………………………………………………….. 160

Взаимодействие с другими виджетами………………………………………………………………………….. 161

Использование гиперссылок…………………………………………………………………………………………… 162

Отображение числовых значений………………………………………………………………………………….. 163

Выделение и копирования текста…………………………………………………………………………………… 163

Индикатор выполнения…………………………………………………………………………………………………………… 163

Индикатор бесконечного выполнения……………………………………………………………………………. 165

Электронный индикатор…………………………………………………………………………………………………………. 166

Ограничения электронного индикатора………………………………………………………………………… 168

Резюме………………………………………………………………………………………………………………………………………. 168

Глава 8. Кнопки, флажки и переключатели…………………………………………. 169

С чего начинаются кнопки? Класс QAbstractButton…………………………………………………………….. 169

Установка текста и изображения……………………………………………………………………………………. 169

Взаимодействие с пользователем…………………………………………………………………………………… 169

Опрос состояния………………………………………………………………………………………………………………. 170

Кнопки………………………………………………………………………………………………………………………………………. 170

Флажки……………………………………………………………………………………………………………………………………… 173

Переключатели………………………………………………………………………………………………………………………… 174

Группировка кнопок………………………………………………………………………………………………………………… 175

Резюме………………………………………………………………………………………………………………………………………. 178

Глава 9. Элементы настройки………………………………………………………………. 180

Класс QAbstractSlider……………………………………………………………………………………………………………… 180

Изменение положения……………………………………………………………………………………………………… 180

Установка диапазона………………………………………………………………………………………………………. 180

Установка шага………………………………………………………………………………………………………………… 181

Установка и получение значений…………………………………………………………………………………… 181

Ползунок…………………………………………………………………………………………………………………………………… 181

Полоса прокрутки……………………………………………………………………………………………………………………. 183

Установщик………………………………………………………………………………………………………………………………. 184

Резюме………………………………………………………………………………………………………………………………………. 185

Глава 10. Элементы ввода……………………………………………………………………. 187

Однострочное текстовое поле………………………………………………………………………………………………… 187

Редактор текста……………………………………………………………………………………………………………………….. 189

Запись в файл……………………………………………………………………………………………………………………. 191

Расцветка синтаксиса (syntax highlighting)…………………………………………………………………….. 192

С чего начинаются виджеты счетчиков?……………………………………………………………………………….. 198

Счетчик……………………………………………………………………………………………………………………………… 199

Элемент ввода даты и времени……………………………………………………………………………………….. 200

Проверка ввода………………………………………………………………………………………………………………………… 200

Резюме………………………………………………………………………………………………………………………………………. 202

Глава 11. Элементы выбора…………………………………………………………………. 203

Простой список………………………………………………………………………………………………………………………… 203

Вставка элементов…………………………………………………………………………………………………………… 203

Выбор элементов пользователем……………………………………………………………………………………. 205

Изменение элементов пользователем…………………………………………………………………………….. 205

Режим пиктограмм……………………………………………………………………………………………………………. 205

Сортировка элементов…………………………………………………………………………………………………….. 206

Иерархические списки…………………………………………………………………………………………………………….. 206

Сортировка элементов…………………………………………………………………………………………………….. 209

Таблицы……………………………………………………………………………………………………………………………………. 210

Выпадающий список……………………………………………………………………………………………………………….. 211

Вкладки…………………………………………………………………………………………………………………………………….. 213

Виджет панели инструментов………………………………………………………………………………………………… 214

Резюме………………………………………………………………………………………………………………………………………. 215

Глава 12. Интервью, или модель-представление…………………………………… 216

Концепция………………………………………………………………………………………………………………………………… 217

Модель………………………………………………………………………………………………………………………………. 218

Представление………………………………………………………………………………………………………………….. 219

Выделение элемента………………………………………………………………………………………………………… 220

Делегат……………………………………………………………………………………………………………………………… 222

Индексы модели……………………………………………………………………………………………………………………….. 224

Иерархические данные……………………………………………………………………………………………………………. 225

Роли элементов………………………………………………………………………………………………………………………… 229

Создание собственных моделей данных……………………………………………………………………………….. 230

Промежуточная модель данных (Proxy model)…………………………………………………………………….. 238

Модель элементно-ориентированных классов…………………………………………………………………….. 240

Резюме………………………………………………………………………………………………………………………………………. 242

Глава 13. Цветовая палитра элементов управления……………………………… 244

Поддержка тёмных тем……………………………………………………………………………………………………………. 247

Резюме………………………………………………………………………………………………………………………………………. 248

Часть III. События и взаимодействие с пользователем. 249

Глава 14. События……………………………………………………………………………….. 250

Переопределение специализированных методов обработки событий………………………………. 252

События клавиатуры……………………………………………………………………………………………………….. 252

Класс QKeyEvent…………………………………………………………………………………………………….. 252

Класс QFocusEvent…………………………………………………………………………………………………. 255

Событие обновления контекста рисования: класс QPaintEvent………………………………….. 255

События мыши…………………………………………………………………………………………………………………. 256

Класс QMouseEvent………………………………………………………………………………………………… 256

Класс QWheelEvent…………………………………………………………………………………………………. 260

Методы enterEvent() и leaveEvent()……………………………………………………………………….. 261

Событие таймера: класс QTimerEvent……………………………………………………………………………. 261

События перетаскивания (drag & drop)………………………………………………………………………….. 261

Класс QDragEnterEvent………………………………………………………………………………………….. 261

Класс QDragLeaveEvent…………………………………………………………………………………………. 262

Класс QDragMoveEvent………………………………………………………………………………………….. 262

Класс QDropEvent…………………………………………………………………………………………………… 262

Остальные классы событий…………………………………………………………………………………………….. 262

Класс QChildEvent………………………………………………………………………………………………….. 262

Класс QCloseEvent………………………………………………………………………………………………….. 262

Класс QHideEvent……………………………………………………………………………………………………. 262

Класс QMoveEvent………………………………………………………………………………………………….. 262

Класс QShowEvent………………………………………………………………………………………………….. 263

Класс QResizeEvent…………………………………………………………………………………………………. 263

Реализация собственных классов событий…………………………………………………………………………… 264

Переопределение метода event()…………………………………………………………………………………………….. 264

Мультитач………………………………………………………………………………………………………………………………… 267

Сохранение работоспособности приложения………………………………………………………………………. 272

Резюме………………………………………………………………………………………………………………………………………. 272

Глава 15. Фильтры событий…………………………………………………………………. 274

Реализация фильтров событий……………………………………………………………………………………………….. 274

Использование лямбда-выражений с фильтрами событий………………………………………………….. 277

Резюме………………………………………………………………………………………………………………………………………. 278

Глава 16. Искусственное создание событий…………………………………………. 279

Резюме………………………………………………………………………………………………………………………………………. 282

Часть IV. Графика и звук…………………………………………………………….. 285

Глава 17. Введение в компьютерную графику……………………………………… 286

Классы геометрии……………………………………………………………………………………………………………………. 286

Точка…………………………………………………………………………………………………………………………………. 286

Двумерный размер…………………………………………………………………………………………………………… 287

Прямоугольник…………………………………………………………………………………………………………………. 289

Прямая линия……………………………………………………………………………………………………………………. 289

Многоугольник…………………………………………………………………………………………………………………. 290

Цвет…………………………………………………………………………………………………………………………………………… 290

Класс QСolor……………………………………………………………………………………………………………………. 291

Цветовая модель RGB……………………………………………………………………………………………………… 291

Цветовая модель HSV………………………………………………………………………………………………………. 292

Цветовая модель HSL………………………………………………………………………………………………………. 294

Цветовая модель CMYK………………………………………………………………………………………………….. 295

Палитра…………………………………………………………………………………………………………………………….. 296

Предопределенные цвета………………………………………………………………………………………………… 296

Резюме………………………………………………………………………………………………………………………………………. 297

Глава 18. Легенда о короле Артуре и контекст рисования……………………. 299

Класс QPainter…………………………………………………………………………………………………………………………. 301

Перья и кисти……………………………………………………………………………………………………………………………. 302

Перо…………………………………………………………………………………………………………………………………… 302

Кисть…………………………………………………………………………………………………………………………………. 303

Градиенты………………………………………………………………………………………………………………………………… 304

Техника сглаживания (Anti-aliasing)………………………………………………………………………………………. 306

Рисование…………………………………………………………………………………………………………………………………. 307

Рисование точек……………………………………………………………………………………………………………….. 308

Рисование линий………………………………………………………………………………………………………………. 308

Рисование сплошных прямоугольников………………………………………………………………………… 309

Рисование заполненных фигур……………………………………………………………………………………….. 310

Запись команд рисования……………………………………………………………………………………………………….. 313

Трансформация систем координат………………………………………………………………………………………… 313

Перемещение…………………………………………………………………………………………………………………….. 314

Масштабирование…………………………………………………………………………………………………………… 314

Поворот…………………………………………………………………………………………………………………………….. 315

Скос…………………………………………………………………………………………………………………………………… 315

Трансформационные матрицы……………………………………………………………………………………….. 315

Графическая траектория (painter path)………………………………………………………………………………….. 316

Отсечения…………………………………………………………………………………………………………………………………. 317

Режим совмещения (composition mode)………………………………………………………………………………….. 318

Графические эффекты……………………………………………………………………………………………………………… 321

Диагностика проблем с рисованием………………………………………………………………………………………. 323

Резюме………………………………………………………………………………………………………………………………………. 323

Глава 19. Растровые изображения………………………………………………………… 325

Форматы графических файлов……………………………………………………………………………………………….. 325

Формат BMP…………………………………………………………………………………………………………………….. 325

Формат GIF……………………………………………………………………………………………………………………….. 326

Формат PNG……………………………………………………………………………………………………………………… 326

Формат JPEG…………………………………………………………………………………………………………………….. 326

Формат WEBP…………………………………………………………………………………………………………………… 326

Формат XPM…………………………………………………………………………………………………………………….. 326

Контекстно-независимое представление………………………………………………………………………………. 328

Класс QImage……………………………………………………………………………………………………………………. 328

Класс QImage как контекст рисования…………………………………………………………………………… 335

Контекстно-зависимое представление…………………………………………………………………………………… 337

Класс QPixmap…………………………………………………………………………………………………………………. 337

Класс QPixmapCache……………………………………………………………………………………………………….. 338

Класс QBitmap………………………………………………………………………………………………………………….. 339

Создание нестандартного окна виджета……………………………………………………………………….. 339

Резюме………………………………………………………………………………………………………………………………………. 341

Глава 20. Работа со шрифтами……………………………………………………………… 342

Отображение строки……………………………………………………………………………………………………………….. 344

Резюме………………………………………………………………………………………………………………………………………. 347

Глава 21. Графическое представление………………………………………………….. 348

Сцена………………………………………………………………………………………………………………………………………… 349

Представление…………………………………………………………………………………………………………………………. 350

Элемент…………………………………………………………………………………………………………………………………….. 350

Определение столкновений элементов…………………………………………………………………………… 353

События……………………………………………………………………………………………………………………………………. 354

Виджеты в графическом представлении……………………………………………………………………………….. 358

Резюме………………………………………………………………………………………………………………………………………. 360

Глава 22. Анимация……………………………………………………………………………… 362

Класс QMovie…………………………………………………………………………………………………………………………… 362

SVG-графика…………………………………………………………………………………………………………………………….. 363

Анимационный движок и машина состояний……………………………………………………………………….. 365

Смягчающие линии………………………………………………………………………………………………………….. 367

Настройка кривых Безье и TCB-сплайнов…………………………………………………………………….. 373

Машина состояний и переходы……………………………………………………………………………………… 373

Резюме………………………………………………………………………………………………………………………………………. 375

Глава 23. Работа с OpenGL…………………………………………………………………… 377

Основные положения OpenGL………………………………………………………………………………………………… 377

Реализация OpenGL-программы…………………………………………………………………………………………….. 379

Разворачивание OpenGL-программ во весь экран………………………………………………………………… 382

Графические примитивы OpenGL…………………………………………………………………………………………… 382

Трехмерная графика………………………………………………………………………………………………………………… 385

Резюме………………………………………………………………………………………………………………………………………. 390

Глава 24. Вывод на печать…………………………………………………………………… 391

Класс QPrinter………………………………………………………………………………………………………………………….. 391

Многостраничная печать………………………………………………………………………………………………… 396

Резюме………………………………………………………………………………………………………………………………………. 397

Глава 25. Разработка собственных элементов управления…………………… 398

Примеры создания виджетов………………………………………………………………………………………………….. 398

Лучшие практики при создании собственных виджетов……………………………………………………… 403

Резюме………………………………………………………………………………………………………………………………………. 404

Глава 26. Элементы со стилем………………………………………………………………. 405

Встроенные стили……………………………………………………………………………………………………………………. 407

Поддержка темной темы…………………………………………………………………………………………………………. 411

Создание собственных стилей……………………………………………………………………………………………….. 411

Методы рисования элементов управления……………………………………………………………………………. 412

Метод рисования простых элементов управления……………………………………………………….. 412

Метод рисования основных элементов управления…………………………………………………….. 413

Метод рисования составных элементов управления……………………………………………………. 413

Реализация стиля простого элемента управления………………………………………………………… 413

Использование каскадных стилей документа………………………………………………………………………. 417

Основные положения……………………………………………………………………………………………………….. 417

Изменение подэлементов…………………………………………………………………………………………………. 419

Управление состояниями………………………………………………………………………………………………… 420

Пример………………………………………………………………………………………………………………………………. 421

Резюме………………………………………………………………………………………………………………………………………. 425

Глава 27. Мультимедиа………………………………………………………………………… 426

Звук……………………………………………………………………………………………………………………………………………. 426

Воспроизведение звуковых эффектов: класс QSoundEffect………………………………………….. 427

Воспроизведение мультимедиа: класс QMediaPlayer………………………………………………….. 427

Создание аудиоплеера…………………………………………………………………………………………… 428

Видео и класс QMediaPlayer…………………………………………………………………………………………… 434

Обработка ошибок в мультимедийных приложениях………………………………………………….. 437

Поддержка камеры…………………………………………………………………………………………………………… 437

Запись медиаконтента…………………………………………………………………………………………………….. 438

Резюме………………………………………………………………………………………………………………………………………. 439

Часть V. Создание приложений………………………………………………. 441

Глава 28. Сохранение настроек приложения………………………………………… 442

Улучшенный доступ к данным……………………………………………………………………………………………….. 449

Резюме………………………………………………………………………………………………………………………………………. 450

Глава 29. Буфер обмена и перетаскивание…………………………………………… 451

Буфер обмена…………………………………………………………………………………………………………………………… 451

Перетаскивание……………………………………………………………………………………………………………………….. 452

Реализация drag………………………………………………………………………………………………………………… 454

Реализация drop……………………………………………………………………………………………………………….. 456

Создание собственных типов перетаскивания……………………………………………………………… 458

Практические советы по работе с буфером обмена и перетаскиванием……………………………. 463

Резюме………………………………………………………………………………………………………………………………………. 464

Глава 30. Интернационализация приложения (см. эл. архив)…………… 1

Подготовка приложения к интернационализации…………………………………………………………. 1

Утилита lupdate………………………………………………………………………………………………………………… 4

Программа Qt Linguist………………………………………………………………………………………………………. 5

Утилита lrelease. Пример программы, использующей перевод…………………………………….. 7

Смена перевода в процессе работы программы……………………………………………………………. 9

Завершающие размышления…………………………………………………………………………………………. 12

Резюме……………………………………………………………………………………………………………………………… 13

Глава 31. Создание меню……………………………………………………………………… 466

«Анатомия» меню…………………………………………………………………………………………………………………….. 466

Контекстные меню…………………………………………………………………………………………………………………… 470

Резюме………………………………………………………………………………………………………………………………………. 471

Глава 32. Диалоговые окна………………………………………………………………….. 473

Правила создания диалоговых окон……………………………………………………………………………………… 473

Класс QDialog………………………………………………………………………………………………………………………….. 474

Модальные диалоговые окна…………………………………………………………………………………………. 474

Немодальные диалоговые окна……………………………………………………………………………………… 475

Создание собственного диалогового окна…………………………………………………………………….. 476

Стандартные диалоговые окна………………………………………………………………………………………………. 479

Диалоговое окно выбора файлов……………………………………………………………………………………. 479

Диалоговое окно настройки принтера…………………………………………………………………………… 483

Диалоговое окно выбора цвета………………………………………………………………………………………. 484

Диалоговое окно выбора шрифта…………………………………………………………………………………… 485

Диалоговое окно ввода……………………………………………………………………………………………………. 486

Диалоговое окно процесса……………………………………………………………………………………………… 487

Диалоговые окна мастера……………………………………………………………………………………………….. 488

Диалоговые окна сообщений………………………………………………………………………………………………….. 489

Окно информационного сообщения……………………………………………………………………………….. 492

Окно предупреждающего сообщения…………………………………………………………………………….. 492

Окно критического сообщения……………………………………………………………………………………….. 492

Окно сообщения о программе…………………………………………………………………………………………. 493

Окно сообщения About Qt………………………………………………………………………………………………… 493

Окно сообщения об ошибке…………………………………………………………………………………………….. 493

Резюме………………………………………………………………………………………………………………………………………. 494

Глава 33. Предоставление помощи………………………………………………………. 496

Всплывающая подсказка………………………………………………………………………………………………………… 496

Система помощи (Online Help)………………………………………………………………………………………………… 498

Использование QAssistant……………………………………………………………………………………………………….. 500

Резюме………………………………………………………………………………………………………………………………………. 501

Глава 34. Главное окно, создание SDI- и MDI-приложений………………….. 503

Класс главного окна QMainWindow………………………………………………………………………………………. 503

Класс действия QAction…………………………………………………………………………………………………………… 504

Панель инструментов………………………………………………………………………………………………………………. 505

Доки…………………………………………………………………………………………………………………………………………… 507

Строка состояния…………………………………………………………………………………………………………………….. 508

Окно заставки…………………………………………………………………………………………………………………………… 509

SDI- и MDI-приложения………………………………………………………………………………………………………….. 511

SDI-приложение……………………………………………………………………………………………………………….. 512

MDI-приложение……………………………………………………………………………………………………………… 517

Резюме………………………………………………………………………………………………………………………………………. 525

Глава 35. Рабочий стол (Desktop)………………………………………………………….. 527

Область уведомлений……………………………………………………………………………………………………………… 527

Работа с экранами…………………………………………………………………………………………………………………… 532

Центрирование окна на экране………………………………………………………………………………………. 532

Получение списка экранов……………………………………………………………………………………………… 532

Работа с координатами и экранами……………………………………………………………………………….. 533

Сигналы QScreen……………………………………………………………………………………………………………… 533

Пример: приложение для захвата экрана……………………………………………………………………… 533

Класс сервиса рабочего стола……………………………………………………………………………………………….. 536

Резюме………………………………………………………………………………………………………………………………………. 536

Часть VI. Особые возможности Qt………………………………………… 537

Глава 36. Работа с файлами, каталогами и потоками ввода/вывода…….. 538

Ввод/вывод: класс QIODevice…………………………………………………………………………………………………. 538

Работа с файлами: класс QFile………………………………………………………………………………………………. 540

Класс QBuffer……………………………………………………………………………………………………………………. 542

Класс QTemporaryFile……………………………………………………………………………………………………… 542

Работа с каталогами: класс QDir…………………………………………………………………………………………… 543

Просмотр содержимого каталога…………………………………………………………………………………… 543

Получение путей к стандартным каталогам…………………………………………………………………. 546

Информация о файлах: класс QFileInfo…………………………………………………………………………………. 547

Файл или каталог?…………………………………………………………………………………………………………… 548

Путь и имя файла……………………………………………………………………………………………………………… 548

Информация о дате и времени………………………………………………………………………………………… 548

Получение атрибутов файла…………………………………………………………………………………………… 548

Определение размера файла…………………………………………………………………………………………… 549

Наблюдение за файлами и каталогами…………………………………………………………………………………. 549

Потоки ввода/вывода………………………………………………………………………………………………………………. 551

Класс QTextStream……………………………………………………………………………………………………………. 551

Класс QDataStream………………………………………………………………………………………………………….. 552

Информация о хранилищах……………………………………………………………………………………………………. 553

Резюме………………………………………………………………………………………………………………………………………. 553

Глава 37. Дата, время и таймер…………………………………………………………….. 555

Дата и время…………………………………………………………………………………………………………………………….. 555

Класс даты QDate…………………………………………………………………………………………………………….. 555

Класс времени: QTime……………………………………………………………………………………………………… 557

Класс даты и времени: QDateTime………………………………………………………………………………….. 558

Таймер………………………………………………………………………………………………………………………………………. 558

Событие таймера……………………………………………………………………………………………………………… 559

Класс QTimer…………………………………………………………………………………………………………………….. 561

Класс QBasicTimer……………………………………………………………………………………………………………. 563

Работа с временнми зонами………………………………………………………………………………………….. 563

Резюме………………………………………………………………………………………………………………………………………. 564

Глава 38. Процессы и потоки……………………………………………………………….. 565

Процессы………………………………………………………………………………………………………………………………….. 565

Потоки………………………………………………………………………………………………………………………………………. 568

Подход 1: наследование от QThread……………………………………………………………………………… 570

Подход 2: перемещение объекта в поток……………………………………………………………………….. 570

Приоритеты………………………………………………………………………………………………………………………. 571

Обмен сообщениями………………………………………………………………………………………………………… 571

Сигнально-слотовые соединения………………………………………………………………………….. 572

Отправка событий…………………………………………………………………………………………………… 577

Синхронизация…………………………………………………………………………………………………………………. 579

Мьютексы………………………………………………………………………………………………………………… 580

Семафоры………………………………………………………………………………………………………………… 581

Ожидание условий………………………………………………………………………………………………….. 582

Блокировка чтения/записи…………………………………………………………………………………….. 583

Возникновение тупиковых ситуаций…………………………………………………………………….. 583

Фреймворк QtConcurrent…………………………………………………………………………………………………………. 584

Цепочки операций……………………………………………………………………………………………………………. 586

Поддержка лямбда-выражений………………………………………………………………………………………. 586

Класс QPromise………………………………………………………………………………………………………………… 586

Резюме………………………………………………………………………………………………………………………………………. 587

Глава 39. Программирование поддержки сети……………………………………… 589

Сокетное соединение………………………………………………………………………………………………………………. 589

Модель «клиент-сервер»………………………………………………………………………………………………….. 590

Реализация TCP-сервера…………………………………………………………………………………………………. 591

Реализация TCP-клиента…………………………………………………………………………………………………. 596

Реализация UDP-сервера и UDP-клиента………………………………………………………………………………. 601

Управление доступом к сети…………………………………………………………………………………………………… 604

Блокирующий подход……………………………………………………………………………………………………………… 610

Режим прокси……………………………………………………………………………………………………………………………. 613

Информация о хосте………………………………………………………………………………………………………………… 613

Есть ли соединение с Интернетом?………………………………………………………………………………………… 614

Новый HTTP-стек…………………………………………………………………………………………………………………….. 615

Протокол WebSocket……………………………………………………………………………………………………………….. 616

Резюме………………………………………………………………………………………………………………………………………. 617

Глава 40. Работа с XML, JSON и Protobuf…………………………………………….. 619

Формат XML…………………………………………………………………………………………………………………………….. 619

Основные понятия и структура XML-документа………………………………………………………….. 619

XML и Qt…………………………………………………………………………………………………………………………… 621

Работа с DOM…………………………………………………………………………………………………………………… 621

Чтение XML-документа………………………………………………………………………………………….. 622

Создание и запись XML-документа………………………………………………………………………. 624

Работа с SAX…………………………………………………………………………………………………………………….. 626

Чтение XML-документа………………………………………………………………………………………….. 626

Классы QXmlStreamReader и QXmlStreamWriter……………………………………………………………. 629

Чтение XML с помощью QXmlStreamReader………………………………………………………… 629

Запись XML с помощью QXmlStreamWriter………………………………………………………….. 630

Формат JSON……………………………………………………………………………………………………………………………. 631

Основные классы для работы с JSON…………………………………………………………………………….. 631

Чтение JSON-файла………………………………………………………………………………………………………….. 632

Запись JSON-файла………………………………………………………………………………………………………….. 633

Формат Protobuf………………………………………………………………………………………………………………………. 635

Схема данных (proto-файл)…………………………………………………………………………………………….. 635

Создание файла с Protobuf-данными……………………………………………………………………………… 636

Чтение Protobuf-данных………………………………………………………………………………………………….. 637

Рекомендации по выбору………………………………………………………………………………………………………… 638

Резюме………………………………………………………………………………………………………………………………………. 639

Глава 41. Программирование баз данных…………………………………………….. 641

Основные положения SQL………………………………………………………………………………………………………. 641

Создание таблицы……………………………………………………………………………………………………………. 642

Операция вставки…………………………………………………………………………………………………………….. 642

Чтение данных………………………………………………………………………………………………………………….. 642

Изменение данных……………………………………………………………………………………………………………. 643

Удаление…………………………………………………………………………………………………………………………… 643

Использование языка SQL в библиотеке Qt…………………………………………………………………………… 643

Соединение с базой данных (второй уровень)………………………………………………………………. 645

Исполнение команд SQL (второй уровень)……………………………………………………………………. 646

Классы SQL-моделей для интервью (третий уровень)………………………………………………….. 649

Модель запроса………………………………………………………………………………………………………. 649

Табличная модель…………………………………………………………………………………………………… 650

Реляционная модель……………………………………………………………………………………………….. 652

Резюме………………………………………………………………………………………………………………………………………. 653

Глава 42. Динамические библиотеки и система расширений
(см. эл. архив)
…………………………………………………………………………………… 1

Динамические библиотеки………………………………………………………………………………………………. 1

Динамическая загрузка и выгрузка библиотеки…………………………………………………….. 3

Особенности именования и загрузки динамических библиотек………………….. 5

Расширения (plug-ins)……………………………………………………………………………………………………….. 6

Расширения для Qt……………………………………………………………………………………………………. 7

Поддержка собственных расширений в приложениях………………………………………….. 8

Диагностика и отладка расширений……………………………………………………………. 12

Создание расширения для приложения………………………………………………………. 13

Система метаданных плагинов……………………………………………………………………. 15

Резюме……………………………………………………………………………………………………………………………… 16

Глава 43. Совместное использование Qt с платформозависимыми API
(см. эл. архив)
…………………………………………………………………………………… 1

Совместное использование с Windows API…………………………………………………………………….. 3

Совместное использование с Linux…………………………………………………………………………………. 5

Совместное использование с macOS………………………………………………………………………………. 5

Системная информация……………………………………………………………………………………………………. 6

Резюме……………………………………………………………………………………………………………………………….. 8

Глава 44. Qt Designer. Быстрая разработка прототипов……………………….. 657

Создание новой формы в Qt Designer……………………………………………………………………………………… 657

Добавление виджетов……………………………………………………………………………………………………………… 660

Компоновка (layout)………………………………………………………………………………………………………………… 661

Порядок следования табулятора……………………………………………………………………………………………. 662

Сигналы и слоты……………………………………………………………………………………………………………………… 663

Использование в формах собственных виджетов…………………………………………………………………. 665

Использование форм в проектах…………………………………………………………………………………………….. 666

Компиляция………………………………………………………………………………………………………………………………. 668

Динамическая загрузка формы………………………………………………………………………………………………. 669

Резюме………………………………………………………………………………………………………………………………………. 672

Глава 45. Проведение тестов (см. эл. архив)……………………………………… 1

Создание тестов………………………………………………………………………………………………………………… 2

Тесты с передачей данных………………………………………………………………………………………. 5

Создание тестов графического интерфейса…………………………………………………………………… 7

Параметры для запуска тестов……………………………………………………………………………………….. 9

Резюме……………………………………………………………………………………………………………………………… 10

Глава 46. Qt WebEngine………………………………………………………………………… 674

А зачем?……………………………………………………………………………………………………………………………………. 675

Быстрый старт…………………………………………………………………………………………………………………………. 676

Создание простого веб-браузера…………………………………………………………………………………………… 678

Ввод адресов…………………………………………………………………………………………………………………….. 678

Управление историей………………………………………………………………………………………………………. 678

Загрузка страниц и ресурсов………………………………………………………………………………………….. 679

Пишем веб-браузер: попытка номер два……………………………………………………………………….. 679

Резюме………………………………………………………………………………………………………………………………………. 683

Глава 47. Интегрированная среда разработки Qt Creator
(см. эл. архив)
…………………………………………………………………………………… 1

Первый запуск…………………………………………………………………………………………………………………… 3

Создаем проект «Hello Qt Creator»………………………………………………………………………………….. 3

Пользовательский интерфейс Qt Creator………………………………………………………………………… 8

Окна вывода………………………………………………………………………………………………………………. 8

Окно проектного обозревателя………………………………………………………………………………… 9

Секция компилирования и запуска………………………………………………………………………….. 9

Редактирование текста…………………………………………………………………………………………………… 11

Как подсвечен ваш синтаксис?……………………………………………………………………………… 11

Скрытие и отображение кода………………………………………………………………………………… 12

Автоматическое дополнение кода………………………………………………………………………… 12

Поиск и замена………………………………………………………………………………………………………… 13

Комбинации клавиш для ускорения работы………………………………………………………… 18

Вертикальное выделение текста………………………………………………………………….. 18

Автоматическое форматирование текста……………………………………………………. 18

Комментирование блоков……………………………………………………………………………… 19

Просмотр кода методов класса, их определений и атрибутов………………….. 19

Помощь, которая всегда рядом…………………………………………………………………….. 20

Интерактивный отладчик и программный экзорцизм…………………………………………………. 21

Синтаксические ошибки…………………………………………………………………………………………. 22

Ошибки компоновки……………………………………………………………………………………………….. 23

Ошибки времени исполнения…………………………………………………………………………………. 23

Логические ошибки…………………………………………………………………………………………………. 24

Трассировка…………………………………………………………………………………………………………….. 24

Команда Step Over…………………………………………………………………………………………. 25

Команда Step Into………………………………………………………………………………………….. 25

Команда Step Out…………………………………………………………………………………………… 26

Контрольные точки………………………………………………………………………………………………… 26

Окно переменных (Local and Watches)………………………………………………………………….. 27

Окно цепочки вызовов (Call Stack)………………………………………………………………………… 28

Резюме……………………………………………………………………………………………………………………………… 28

Глава 48. Рекомендации по миграции программ из Qt 5 в Qt 6…………….. 686

Основные отличия Qt 6 от Qt 5……………………………………………………………………………………………….. 686

Подробности перевода на Qt 6……………………………………………………………………………………………….. 686

Виджеты: замена устаревших классов………………………………………………………………………….. 687

Контейнерные классы……………………………………………………………………………………………………… 687

Класс QVector………………………………………………………………………………………………………….. 687

Класс QLinkedList……………………………………………………………………………………………………. 688

Функция qVariantValue()………………………………………………………………………………………… 688

Система сигналов и слотов……………………………………………………………………………………………… 688

Графика и рендеринг……………………………………………………………………………………………………….. 688

Платформозависимый код………………………………………………………………………………………………. 689

Мультимедиа……………………………………………………………………………………………………………………. 689

QML и Qt Quick………………………………………………………………………………………………………………………… 689

Управление памятью и современный C++…………………………………………………………………………….. 690

Модуль совместимости Qt5Compat……………………………………………………………………………………….. 690

Пошаговый план миграции…………………………………………………………………………………………………….. 690

Резюме………………………………………………………………………………………………………………………………………. 691

Часть VII. Язык сценариев JavaScript…………………………………… 693

Глава 49. Основы поддержки сценариев JavaScript (см. эл. архив)….. 1

Принцип взаимодействия с языком сценариев……………………………………………………………….. 2

Первый шаг использования сценария…………………………………………………………………………….. 5

Привет, сценарий………………………………………………………………………………………………………………. 6

Резюме……………………………………………………………………………………………………………………………….. 7

Глава 50. Синтаксис языка сценариев (см. эл. архив)………………………. 1

Зарезервированные ключевые слова……………………………………………………………………………… 1

Комментарии…………………………………………………………………………………………………………………….. 2

Переменные……………………………………………………………………………………………………………………….. 2

Предопределенные типы данных……………………………………………………………………………. 3

Числовой тип……………………………………………………………………………………………………. 3

Строковый тип…………………………………………………………………………………………………. 4

Логический тип………………………………………………………………………………………………… 5

Null и Undefined……………………………………………………………………………………………….. 5

Тип Symbol………………………………………………………………………………………………………… 5

Преобразование типов……………………………………………………………………………………………… 5

Операции…………………………………………………………………………………………………………………………… 6

Операторы присваивания………………………………………………………………………………………… 6

Арифметические операции………………………………………………………………………………………. 7

Поразрядные операции…………………………………………………………………………………………….. 8

Операции сравнения…………………………………………………………………………………………………. 8

Приоритет выполнения операций……………………………………………………………………………. 9

Управляющие структуры………………………………………………………………………………………………. 10

Условные операторы……………………………………………………………………………………………… 10

Оператор if … else…………………………………………………………………………………………… 10

Оператор switch……………………………………………………………………………………………… 11

Оператор условного выражения……………………………………………………………………………. 12

Циклы……………………………………………………………………………………………………………………….. 12

Операторы break и continue………………………………………………………………………….. 12

Цикл for…………………………………………………………………………………………………………… 12

Цикл while………………………………………………………………………………………………………. 13

Цикл do…while………………………………………………………………………………………………… 13

Оператор with………………………………………………………………………………………………………….. 13

Исключительные ситуации……………………………………………………………………………………. 14

Оператор try…catch……………………………………………………………………………………….. 14

Оператор throw………………………………………………………………………………………………. 15

Функции…………………………………………………………………………………………………………………………… 15

Встроенные функции………………………………………………………………………………………………. 17

Объектная ориентация…………………………………………………………………………………………………… 17

Статические классы……………………………………………………………………………………………….. 19

Наследование………………………………………………………………………………………………………….. 20

Перегрузка методов………………………………………………………………………………………………… 23

Сказание о «джейсоне»…………………………………………………………………………………………… 23

Резюме……………………………………………………………………………………………………………………………… 24

Глава 51. Встроенные объекты JavaScript (см. эл. архив)…………………. 1

Объект Global……………………………………………………………………………………………………………………. 1

Объект Number………………………………………………………………………………………………………………….. 1

Объект Boolean…………………………………………………………………………………………………………………. 2

Объект String…………………………………………………………………………………………………………………….. 2

Замена………………………………………………………………………………………………………………………… 2

Получение символов…………………………………………………………………………………………………. 2

Получение подстроки……………………………………………………………………………………………….. 2

Объект RegExp…………………………………………………………………………………………………………………… 3

Проверка строки……………………………………………………………………………………………………….. 3

Поиск позиции совпадений………………………………………………………………………………………. 3

Найденное совпадение…………………………………………………………………………………………….. 4

Получение всех совпадений…………………………………………………………………………………….. 4

Замена с использованием функции…………………………………………………………………………. 4

Разделение строки…………………………………………………………………………………………………….. 4

Объект Array……………………………………………………………………………………………………………………… 4

Дополнение массива элементами……………………………………………………………………………. 5

Адресация элементов……………………………………………………………………………………………….. 5

Изменение порядка элементов массива………………………………………………………………….. 5

Преобразование массива в строку………………………………………………………………………….. 6

Объединение массивов……………………………………………………………………………………………… 6

Упорядочивание элементов……………………………………………………………………………………… 6

Многомерные массивы…………………………………………………………………………………………….. 6

Объект Date……………………………………………………………………………………………………………………….. 7

Объект Маth………………………………………………………………………………………………………………………. 8

Модуль числа……………………………………………………………………………………………………………. 9

Округление………………………………………………………………………………………………………………… 9

Определение максимума и минимума…………………………………………………………………….. 9

Возведение в степень………………………………………………………………………………………………… 9

Вычисление квадратного корня…………………………………………………………………………….. 10

Генератор случайных чисел………………………………………………………………………………….. 10

Тригонометрические методы…………………………………………………………………………………. 10

Вычисление натурального логарифма…………………………………………………………………. 11

Объект Function………………………………………………………………………………………………………………. 11

Резюме……………………………………………………………………………………………………………………………… 11

Глава 52. Классы поддержки JavaScript и практические примеры
(см. эл. архив)
…………………………………………………………………………………… 1

Класс QJSValue…………………………………………………………………………………………………………………. 1

Класс QJSEngine………………………………………………………………………………………………………………. 1

Практические примеры…………………………………………………………………………………………………….. 2

«Черепашья» графика……………………………………………………………………………………………….. 2

Сигналы, слоты и функции………………………………………………………………………………………. 8

Полезные дополнительные функции…………………………………………………………………….. 12

Резюме……………………………………………………………………………………………………………………………… 15

Часть VIII. Технология Qt Quick……………………………………………… 695

Глава 53. Знакомство с Qt Quick…………………………………………………………… 696

А зачем?……………………………………………………………………………………………………………………………………. 696

Введение в QML……………………………………………………………………………………………………………………….. 698

Быстрый старт…………………………………………………………………………………………………………………………. 700

Использование JavaScript в QML……………………………………………………………………………………………. 704

Резюме………………………………………………………………………………………………………………………………………. 706

Глава 54. Элементы……………………………………………………………………………… 707

Визуальные элементы……………………………………………………………………………………………………………… 707

Свойства элементов…………………………………………………………………………………………………………………. 709

Собственные свойства…………………………………………………………………………………………………….. 712

Создание собственных элементов………………………………………………………………………………………….. 714

Создание собственных модулей…………………………………………………………………………………………….. 716

Динамическое создание элементов………………………………………………………………………………………… 717

Элемент Flickable…………………………………………………………………………………………………………………….. 717

Готовые элементы пользовательского интерфейса……………………………………………………………… 718

Диалоговые окна……………………………………………………………………………………………………………………… 722

Резюме………………………………………………………………………………………………………………………………………. 724

Глава 55. Управление размещением элементов (см. эл. архив)…………. 1

Фиксаторы…………………………………………………………………………………………………………………………. 1

Традиционные размещения……………………………………………………………………………………………… 7

Размещение в виде потока……………………………………………………………………………………………… 11

Резюме……………………………………………………………………………………………………………………………… 12

Глава 56. Элементы графики (см. эл. архив)…………………………………….. 1

Цвета………………………………………………………………………………………………………………………………….. 1

Растровые изображения…………………………………………………………………………………………………… 2

Элемент Image…………………………………………………………………………………………………………… 2

Элемент BorderImage………………………………………………………………………………………………… 6

Градиенты…………………………………………………………………………………………………………………………. 7

Шрифты……………………………………………………………………………………………………………………………… 9

Рисование на элементах холста……………………………………………………………………………………. 10

Шейдеры и эффекты……………………………………………………………………………………………………….. 14

Резюме……………………………………………………………………………………………………………………………… 17

Глава 57. Пользовательский ввод (см. эл. архив)……………………………… 1

Область мыши…………………………………………………………………………………………………………………… 1

Сигналы…………………………………………………………………………………………………………………………….. 4

Ввод с клавиатуры……………………………………………………………………………………………………………. 8

Фокус………………………………………………………………………………………………………………………….. 8

«Сырой» ввод…………………………………………………………………………………………………………… 10

Мультитач………………………………………………………………………………………………………………………. 12

Резюме……………………………………………………………………………………………………………………………… 14

Глава 58. Анимация……………………………………………………………………………… 729

Анимация при изменении свойств………………………………………………………………………………………….. 729

Анимация для изменения числовых значений……………………………………………………………….. 731

Анимация с изменением цвета………………………………………………………………………………………… 732

Анимация с поворотом…………………………………………………………………………………………………….. 733

Анимации поведения……………………………………………………………………………………………………………….. 734

Параллельные и последовательные анимации…………………………………………………………………….. 735

Состояния и переходы…………………………………………………………………………………………………………….. 739

Состояния…………………………………………………………………………………………………………………………. 739

Переходы………………………………………………………………………………………………………………………….. 741

Модуль частиц…………………………………………………………………………………………………………………………. 743

Резюме………………………………………………………………………………………………………………………………………. 747

Глава 59. Модель/Представление…………………………………………………………. 748

Модели……………………………………………………………………………………………………………………………………… 748

Модель списка………………………………………………………………………………………………………………….. 748

JSON-модель……………………………………………………………………………………………………………………… 749

Представление данных моделей…………………………………………………………………………………………….. 750

Элемент ListView………………………………………………………………………………………………………………. 750

Элемент GridView…………………………………………………………………………………………………………….. 753

Элемент PathView…………………………………………………………………………………………………………….. 755

Визуальная модель данных……………………………………………………………………………………………………. 757

Резюме………………………………………………………………………………………………………………………………………. 759

Глава 60. Qt Quick и C++……………………………………………………………………… 760

Использование языка QML в C++…………………………………………………………………………………………… 760

Взаимодействие из C++ со свойствами QML-элементов и вызов их функций……………. 761

Соединение QML-сигналов со слотами C++…………………………………………………………………. 763

Использование компонентов языка C++ в QML……………………………………………………………………. 766

Экспорт объектов и виджетов из C++ в QML…………………………………………………………………. 767

Использование зарегистрированных объектов C++, их свойств и методов в QML……. 769

Реализация визуальных элементов QML на C++………………………………………………………….. 773

Класс QQuickImageProvider……………………………………………………………………………………………. 776

Резюме………………………………………………………………………………………………………………………………………. 780

Глава 61. 3D-графика: Qt 3D………………………………………………………………… 782

Основы………………………………………………………………………………………………………………………………………. 782

Cвет…………………………………………………………………………………………………………………………………………… 783

Камера………………………………………………………………………………………………………………………………………. 784

3D-объекты……………………………………………………………………………………………………………………………….. 785

Материалы……………………………………………………………………………………………………………………………….. 787

Трансформация………………………………………………………………………………………………………………………… 791

Анимация………………………………………………………………………………………………………………………………….. 792

Резюме………………………………………………………………………………………………………………………………………. 794

Часть IX. Мобильные приложения и Qt………………………………… 797

Глава 62. Введение в мир мобильных приложений………………………………. 798

Смартфоны изменили всё………………………………………………………………………………………………………… 799

Виртуальные магазины приложений…………………………………………………………………………………….. 800

Распространение приложений вне виртуального магазина………………………………………………… 803

Qt 6 и разработка мобильных приложений…………………………………………………………………………… 803

Резюме………………………………………………………………………………………………………………………………………. 804

Глава 63. Подготовка к работе над мобильными приложениями…………. 806

Подготовка среды для разработки iOS-приложений……………………………………………………………. 806

Резюме………………………………………………………………………………………………………………………………………. 809

Глава 64. Особенности разработки приложений
для мобильных устройств…………………………………………………………………….. 810

Анатомия свойств для iOS-приложений…………………………………………………………………………………. 811

Свойства iOS-приложений………………………………………………………………………………………………. 811

Автоматический поворот………………………………………………………………………………………………………… 813

Обработка поворота в приложениях……………………………………………………………………………………… 815

Сенсоры……………………………………………………………………………………………………………………………………. 816

Пользовательский ввод при помощи пальцев……………………………………………………………………….. 819

Положение рук…………………………………………………………………………………………………………………………. 821

Резюме………………………………………………………………………………………………………………………………………. 822

Глава 65. Пример разработки мобильного приложения (см. эл. архив) 1

Обдумывание и планирование приложения…………………………………………………………………… 1

Название приложения………………………………………………………………………………………………. 2

Значок приложения…………………………………………………………………………………………………… 2

Что будет в первой версии?……………………………………………………………………………………… 3

Пишем код…………………………………………………………………………………………………………………………. 5

Добавление к приложению значков и стартовых экранов…………………………………………. 12

Резюме……………………………………………………………………………………………………………………………… 13

Глава 66. Публикация в магазине мобильных приложений
(см. эл. архив)
…………………………………………………………………………………… 1

Этапы работы…………………………………………………………………………………………………………………… 1

Регистрация……………………………………………………………………………………………………………….. 2

Настройки для запуска приложений на реальных устройствах………………………….. 3

Создание электронной подписи………………………………………………………………………………. 8

Создание страницы приложения…………………………………………………………………………….. 9

Загрузка и публикация приложения……………………………………………………………………… 15

Резюме……………………………………………………………………………………………………………………………… 17

Часть X. Qt и ИИ………………………………………………………………………………. 825

Глава 67. Разработчик Qt в эпоху искусственного интеллекта…………….. 826

От искры до пепла — знакомый путь разработчика……………………………………………………………. 826

История революций: огонь, пар, электричество и… интеллект……………………………………………. 826

Взгляд на нейросети по-человечески…………………………………………………………………………………….. 827

Страх, который стоит рядом с возможностью………………………………………………………………………. 827

Новая типология разработчиков……………………………………………………………………………………………. 827

Новый язык: диалог с машиной……………………………………………………………………………………………… 828

Неудобная правда: что действительно происходит…………………………………………………………….. 828

К чему готовиться: навыки будущего……………………………………………………………………………………. 830

Навык № 1: Архитектурное мышление………………………………………………………………………….. 830

Навык № 2: Промпт-инжиниринг — язык взаимодействия с ИИ………………………………….. 830

Навык № 3: Гибридное мышление — сила симбиоза человека и ИИ…………………………. 831

Навык № 4: Управление ИИ-агентами — оркестровка цифровой команды……………….. 831

Навык № 5: Фундаментальные знания…………………………………………………………………………… 832

Qt 6 — ваше секретное оружие в эпоху ИИ…………………………………………………………………………… 832

Почему Qt идеально подходит для ИИ-разработки?……………………………………………………. 832

Финальные мысли……………………………………………………………………………………………………………………. 833

Мир, где джуниоры исчезают…………………………………………………………………………………………. 833

Рынок ищет «сшивателей миров»……………………………………………………………………………………. 833

Что не сможет автоматизировать ни одна нейросеть?…………………………………………………. 834

Три простые истины………………………………………………………………………………………………………… 834

Мы уже проходили это……………………………………………………………………………………………………. 834

Трансформация, а не исчезновение………………………………………………………………………………… 835

Где наша настоящая ценность?……………………………………………………………………………………… 835

Резюме………………………………………………………………………………………………………………………………………. 835

Глава 68. Чат-боты в Qt-разработке……………………………………………………… 837

Почему чат-боты стали незаменимыми…………………………………………………………………………………. 837

Типы современных моделей……………………………………………………………………………………………………. 838

Reasoning-модели…………………………………………………………………………………………………………….. 838

Vision-модели и мультимодальные модели……………………………………………………………………. 838

Мультиязычные модели………………………………………………………………………………………………….. 839

Облачные чат-боты…………………………………………………………………………………………………………………. 839

ChatGPT…………………………………………………………………………………………………………………………….. 839

Генерация визуального контента и кода полноценного приложения……………….. 841

Собственные GPTs и Projects………………………………………………………………………………….. 843

Клиентские приложения ChatGPT…………………………………………………………………………. 845

Слабые стороны ChatGPT……………………………………………………………………………………… 845

Claude………………………………………………………………………………………………………………………………… 845

Экономия токенов: батчинг запросов…………………………………………………………………… 847

Генерация кода с использованием визуального контента………………………………….. 848

Клиентские приложения Claude…………………………………………………………………………….. 848

Ограничения Claude……………………………………………………………………………………………….. 849

Дополнительные облачные чат-боты……………………………………………………………………………. 849

Локальные чат-боты……………………………………………………………………………………………………………….. 851

Зачем Qt-разработчику локальные модели?…………………………………………………………………. 851

Почему это особенно важно для Qt-разработчика?……………………………………………. 851

LM Studio………………………………………………………………………………………………………………………….. 851

Ollama……………………………………………………………………………………………………………………………….. 853

Сильные стороны Ollama……………………………………………………………………………………….. 854

Недостатки Ollama…………………………………………………………………………………………………. 855

Jan……………………………………………………………………………………………………………………………………… 855

GPT4All……………………………………………………………………………………………………………………………… 856

«Железо» для локальных LLM……………………………………………………………………………………….. 857

О размере моделей………………………………………………………………………………………………….. 858

Принцип выбора……………………………………………………………………………………………………… 858

Cравнение человеческого мозга и LLM………………………………………………………………… 858

Гибридный подход………………………………………………………………………………………………………………….. 858

Резюме………………………………………………………………………………………………………………………………………. 859

Глава 69. ИИ-IDE и консольные инструменты в Qt-разработке…………… 861

Gemini CLI: ИИ-ассистент в терминале…………………………………………………………………………………. 861

Установка и начало работы……………………………………………………………………………………………. 862

Работа с кодом…………………………………………………………………………………………………………………. 863

Экосистема CLI-инструментов………………………………………………………………………………………………. 864

Cursor: ИИ-IDE следующего поколения…………………………………………………………………………………. 865

Загрузка и установка……………………………………………………………………………………………………….. 865

Архитектура и режимы работы………………………………………………………………………………………. 867

Три режима работы: выбери нужный подход……………………………………………………………….. 867

Режим Agent (агента): автопилот для сложных задач…………………………………………. 867

Режим вопросов (Ask): консультант и аналитик………………………………………………….. 868

Режим Plan (план): создание подробных планов…………………………………………………. 868

Правила проекта: обучаем ИИ вашему стилю и подходу……………………………………………. 868

«Горячие клавиши»: ваш боевой арсенал……………………………………………………………………… 870

Автодополнение на стероидах………………………………………………………………………………. 870

Встроенное редактирование………………………………………………………………………………….. 871

Чат с кодовой базой………………………………………………………………………………………………… 871

Лучшие практики работы с ИИ в Qt-проектах………………………………………………………………. 872

Работа с контекстом……………………………………………………………………………………………….. 872

Использование MCP-серверов……………………………………………………………………………….. 873

Структурирование промптов…………………………………………………………………………………. 873

Итеративная разработка………………………………………………………………………………………… 874

Проверяйте Qt-специфику………………………………………………………………………………………. 874

Рефакторинг и оптимизация…………………………………………………………………………………… 874

Используйте скриншоты для UI…………………………………………………………………………….. 875

Сравнение Gemini CLI и Cursor на примере рефакторинга плеера…………………………………….. 875

Экосистема IDE-инструментов для разработки с ИИ…………………………………………………………… 876

Резюме………………………………………………………………………………………………………………………………………. 877

Глава 70. Промпт-инжиниринг как новый навык……………………………….. 879

Что изменилось и почему это важно для Qt-разработчика?………………………………………………… 879

Анатомия современного промпта…………………………………………………………………………………………… 880

Современные типы промптов…………………………………………………………………………………………………. 881

Тип A…………………………………………………………………………………………………………………………………. 881

Тип B…………………………………………………………………………………………………………………………………. 882

Тип C…………………………………………………………………………………………………………………………………. 882

Лучшие практики эффективного взаимодействия с ИИ………………………………………………… 883

Техника 1. Декомпозиция: разделяй и властвуй………………………………………………….. 884

Техника 2. «Покажи — повтори — расширь»………………………………………………………. 884

Техника 3. Явное управление версиями и устаревшими API……………………………… 885

Техника 4. Ограничительная…………………………………………………………………………………. 885

Практическая библиотека промптов……………………………………………………………………………………… 885

Работа с различными ИИ-платформами………………………………………………………………………… 885

Особенности применения CursorIDE…………………………………………………………………….. 886

Особенности применения Gemini CLI…………………………………………………………………… 886

Особенности применения LM Studio, Ollama, Jan и GPT4All………………………………. 886

И наконец………………………………………………………………………………………………………………………….. 886

Промпты для рефакторинга…………………………………………………………………………………………….. 886

Документация: создание и обновление………………………………………………………………………….. 888

Промпты для отладки: поиск и исправление багов………………………………………………………. 890

Промпты для ревью кода: поиск потенциальных проблем………………………………………….. 893

Промпт для тестирования: автоматизация проверок……………………………………………………. 895

Промпты для портирования……………………………………………………………………………………………. 896

Заключение: ответственность разработчика в эпоху ИИ-ассистентов………………………………. 898

Юридические риски и происхождение кода………………………………………………………………….. 898

Предвзятость и дискриминация………………………………………………………………………………………. 898

Утечка интеллектуальной собственности……………………………………………………………………… 898

Деградация инженерного мышления……………………………………………………………………………… 899

Правила безопасного применения………………………………………………………………………………….. 899

Баланс между скоростью и контролем………………………………………………………………………….. 899

Резюме………………………………………………………………………………………………………………………………………. 899

Эпилог………………………………………………………………………………………………….. 901

Приложения…………………………………………………………………………………… 903

Приложение 1. Настройка среды для работы над Qt-приложениями……. 904

Настройка среды для macOS………………………………………………………………………………………………….. 904

Настройка среды для Windows………………………………………………………………………………………………. 906

Настройка среды для Ubuntu Linux……………………………………………………………………………………….. 907

Приложение 2. Таблица простых чисел………………………………………………… 909

Приложение 3. Таблицы семибитной кодировки ASCII……………………….. 912

Приложение 4. Описание сопровождающего книгу файлового архива… 915

Предметный указатель…………………………………………………………………………. 926

Опубликовано

Game++. Устройство и оптимизация игрового движка

Game++. Устройство и оптимизация игрового движка

Книга рассказывает о тонкостях разработки игрового движка на языке C++.  На материале компьютерных игр AAA-класса подробно разобран полный спектр работы со сложными программами на C++, способы оптимизации кода, структуры данных и их выбор для достижения максимальной производительности. Особое внимание уделено стандартной библиотеке шаблонов (STL) языка C++, многопоточной обработке, а также решению непредвиденных проблем, связанных с неопределённым поведением, поддержкой и обновлением сложнейших баз кода, а также поддержке работоспособности высоконагруженных систем.

Для программистов С++

 

Книга представляет собой сборник размышлений о языке программирования C++, алгоритмах и практиках в контексте разработки игр — о его сильных и слабых сторонах, практических решениях и устоявшихся способах работы. C++ на сегодняшний день остается основным языком в индустрии разработки игр благодаря сочетанию высокой производительности, гибкости и широкихвозможностей низкоуровневого контроля.

Несмотря на свою популярность, он обладает множеством архитектурных и синтаксических проблем, которые сложно устранить из-за необходимости поддерживать обратную совместимость и учитывать текущее направление развития языка.

Автор не претендует на универсальные ответы. В некоторых случаях он предлагает конкретные идеи и даже возможные решения, но чаще всего фокусируется на выявлении проблем производительности и обсуждении общих принципов проектирования современных игр и игровых движков. Во многих местах книги предложены решения, которые расходятся с общепринятыми подходами для разработки программного обеспечения.

По сути, это не академическое исследование и не руководство к действию — это личный перечень наблюдений, пожеланий и претензий к C++. В книге описаны подходы к разработке игр, выработанные автором на основе собственного опыта. Это бесценный материал, помогающий понять, как заставить сложные высоконагруженные системы работать предсказуемо, безотказно и с приемлемой скоростью.

Ключевые темы:

  • Архитектура игровых движков
  • Работа с памятью в компьютерных играх AAA-класса и других приложениях с высокими требованиями к производительности
  • Структуры данных языка С++
  • Работа со стандартной библиотекой шаблонов C++ (STL)
  • Обработка исключений
  • Неопределённое поведение и способы его предотвращения
  • Память и аллокаторы
  • Оптимизация в C++
  • Многопоточность
  • Классические паттерны проектирования применительно к разработке игр
Кушниренко Сергей Сергеевич

Сергей Кушниренко — разработчик с более чем двадцатилетним опытом программирования и создания игр. Выпускник Национального исследовательского университета ИТМО. Начинал карьеру с разработки программного обеспечения для военно-морских тренажеров, навигационных систем и сетевых решений. Последние пятнадцать лет специализируется на разработке игр: в Electronic Arts занимался оптимизацией игр The Sims и SimCity BuildIt, в Gaijin Entertainment руководил переносом игр на платформы Nintendo Switch и Apple TV. Активно участвует в проектах с открытым исходным кодом, включая библиотеку ImSpinner и проект восстановления игры Pharaoh (1999).

Книгу “Game++. Устройство и оптимизация игрового движка” можно купить в нашем интенет-магазине.

Благодарности……………………………………………………………………………………….. 11

Disclaimer……………………………………………………………………………………………….. 13

От автора……………………………………………………………………………………………….. 15

Отзыв…………………………………………………………………………………………………….. 17

Кому стоит прочитать эту книгу?…………………………………………………………… 19

Часть I. Основы……………………………………………………………………………….. 21

0x10. С++, движки и архитектуры………………………………………………………….. 23

Почему С++?………………………………………………………………………………………………………………………………. 23

Что такое игровой движок?……………………………………………………………………………………………………….. 24

Первый главный вопрос — зачем?…………………………………………………………………………………………… 25

Второй главный вопрос — а надо ли?…………………………………………………………………………………….. 28

Либы + cmake != движок……………………………………………………………………………………………………………. 28

Полезности…………………………………………………………………………………………………………………………………. 30

Программирование……………………………………………………………………………………………………………………. 31

Главное окно (Main window)…………………………………………………………………………………………………….. 31

Игровой цикл………………………………………………………………………………………………………………………………. 32

Пользовательский ввод……………………………………………………………………………………………………………… 32

Графика………………………………………………………………………………………………………………………………………. 34

Ресурсы……………………………………………………………………………………………………………………………………….. 35

Вывод звука………………………………………………………………………………………………………………………………… 37

Физика…………………………………………………………………………………………………………………………………………. 37

AI…………………………………………………………………………………………………………………………………………………. 38

…Behavior Trees (BT)………………………………………………………………………………………………………….. 39

…GOAP (Goal-Oriented Action Planning)…………………………………………………………………………….. 39

…FSM (Finite State Machine)………………………………………………………………………………………………. 39

…Utility AI……………………………………………………………………………………………………………………………. 40

…экзотика: HTN, ML, Neural Nets, RL……………………………………………………………………………….. 40

…pathfinding………………………………………………………………………………………………………………………… 41

…navmesh……………………………………………………………………………………………………………………………. 41

…AI — это не про “умных врагов”…………………………………………………………………………………….. 42

Скрипты и конфиги…………………………………………………………………………………………………………………….. 42

…это не про производительность и не про fps…………………………………………………………………. 43

…это про удобство и скорость разработки………………………………………………………………………. 43

…на удивление, это про безопасность……………………………………………………………………………… 43

…это про реконфигурабельность проекта в целом………………………………………………………….. 44

…это дверь для комьюнити………………………………………………………………………………………………… 44

…это — всем не угодишь……………………………………………………………………………………………………. 44

Сеть……………………………………………………………………………………………………………………………………………… 45

…синхронизация состояний………………………………………………………………………………………………. 45

…предсказание ввода и откат (rollback netcode)……………………………………………………………… 46

…интерполяция, экстраполяция, сглаживание………………………………………………………………… 46

…безопасный протокол общения………………………………………………………………………………………. 47

…шифрование (параноиками просто так не становятся)………………………………………………… 47

…репликация объектов………………………………………………………………………………………………………. 47

…логирование и отладка……………………………………………………………………………………………………. 48

…борьба с читерами…………………………………………………………………………………………………………… 48

UI…………………………………………………………………………………………………………………………………………………. 48

Tools…………………………………………………………………………………………………………………………………………….. 49

…конвертеры уровня………………………………………………………………………………………………………….. 50

…проверка ресурсов…………………………………………………………………………………………………………… 50

Архитектура……………………………………………………………………………………………………………………………….. 50

…нет архитектуры — тоже архитектура………………………………………………………………………….. 51

…godobject — тоже архитектура………………………………………………………………………………………. 51

…ECS — модно! Но…………………………………………………………………………………………………………….. 52

Игра-движок……………………………………………………………………………………………………………………………….. 52

0x11. Архитектуры игровых движков…………………………………………………….. 55

Unity (Unitary Architecture)………………………………………………………………………………………………………… 57

Big Ball of Mud……………………………………………………………………………………………………………………. 58

Unreal Engine (Layered Architecture)………………………………………………………………………………………….. 62

CryEngine (Microkernel Architecture)…………………………………………………………………………………………. 66

Dagor (Data-driven Architecture)………………………………………………………………………………………………… 70

X-Ray Engine (Monolith Architecture)………………………………………………………………………………………… 72

Godot (Modules/Services Architecture)……………………………………………………………………………………….. 76

Часть II. Оптимизации…………………………………………………………………. 79

0x20. Какие бывают оптимизации…………………………………………………………. 81

Оптимизации на уровне архитектуры (~50% прироста)………………………………………………………… 83

Оптимизации на уровне алгоритмов/структур (~30%)…………………………………………………………… 84

Оптимизации на уровне исходного кода (~10%)…………………………………………………………………….. 85

Игровые реплеи (~?%)……………………………………………………………………………………………………………….. 91

Изоляция компонентов (~5%)……………………………………………………………………………………………………. 91

Специфичные низкоуровневые оптимизации (<3%)……………………………………………………………….. 92

Все остальное (~10%)………………………………………………………………………………………………………………… 92

Тесты производительности (Benchmarks)……………………………………………………………………………….. 92

Измерения…………………………………………………………………………………………………………………………………… 94

Изменения и интуиция инженера……………………………………………………………………………………………… 95

“Горячие” функции и “бутылочные горлышки”………………………………………………………………………. 96

“Горячие” функции (Hotspots)…………………………………………………………………………………………… 97

“Бутылочное горлышко” (Bottlenecks)……………………………………………………………………………… 97

Заблуждения и мифы…………………………………………………………………………………………………………………. 99

Инструменты……………………………………………………………………………………………………………………………. 102

Теория и термины…………………………………………………………………………………………………………….. 103

История одной оптимизации…………………………………………………………………………………………………… 106

Упаковка булевых значений…………………………………………………………………………………………………… 111

Без упаковки……………………………………………………………………………………………………………………… 112

std::bitset……………………………………………………………………………………………………………………………. 114

сustom_bitset……………………………………………………………………………………………………………………… 114

Выводы……………………………………………………………………………………………………………………………………… 120

0x21. Оптимизации строк…………………………………………………………………….. 123

Пул строк (String interning)………………………………………………………………………………………………………. 123

Не совсем строки……………………………………………………………………………………………………………………… 126

Реализация xstring……………………………………………………………………………………………………………………. 129

Как использовать…………………………………………………………………………………………………………………….. 131

Влияние на архитектуру…………………………………………………………………………………………………………. 132

Идентификаторы (Identifiers)………………………………………………………………………………………………….. 133

Короткие строки (Short String Optimisation)…………………………………………………………………………… 135

Короткоживущие строки (Short Live String)…………………………………………………………………………… 137

Долгоживущие строки (Long Live String)……………………………………………………………………………….. 141

Арены строк……………………………………………………………………………………………………………………………… 142

0x22. Оптимизации массивов……………………………………………………………….. 145

Оптимизация массивов (Cooking vectors)………………………………………………………………………………. 145

Недостатки векторов……………………………………………………………………………………………………………….. 150

Фиксированный массив (Fixed array)……………………………………………………………………………………… 155

Размерность стека……………………………………………………………………………………………………………………. 159

Статический вектор (Static vector)………………………………………………………………………………………….. 160

Гибридный вектор (Hybrid vector)………………………………………………………………………………………….. 164

“Холодные” и “горячие” данные (Hot/Cold data layout)……………………………………………………….. 166

0x23. Оптимизации аллокаторов………………………………………………………….. 169

Такие разные аллокаторы (Dancing with allocators)……………………………………………………………… 169

Управление памятью (Memory management)……………………………………………………………………….. 170

Ручное управление памятью (Manual memory management)……………………………………………… 172

Подсчет ссылок (RC, References counting)…………………………………………………………………………….. 173

Автоматический подсчет ссылок (ARC)………………………………………………………………………………… 174

Уникальное владение (Unique ownership)………………………………………………………………………………. 177

Фрагментация (Fragmentation)……………………………………………………………………………………………….. 178

Внутренняя фрагментация (Internal fragmentation)………………………………………………………. 178

Внешняя фрагментация (External fragmentation)…………………………………………………………… 179

Блок, заголовок, время жизни (block, header, lifetime)…………………………………………………………… 180

Получение ресурса есть инициализация (RAII, Resource Acquisition Is Initialization)………. 181

Утечка памяти (Memory leak)…………………………………………………………………………………………………. 182

Повторное освобождение (Double free)………………………………………………………………………………….. 183

“Висячие” указатели (Dangling pointers)…………………………………………………………………………………. 184

Повреждения кучи (Heap corruption)……………………………………………………………………………………… 185

Оборонительное программирование (Defensive programming)……………………………………………. 186

Умные указатели (Smart pointers)…………………………………………………………………………………………… 187

Собственные менеджеры памяти (Custom allocators)…………………………………………………………… 187

Отложенное освобождение (Lazy destroy)…………………………………………………………………………….. 188

Выделенная область памяти (Мemory arena)……………………………………………………………………….. 189

Дескрипторы объектов (Object handle)………………………………………………………………………………….. 190

Зависимости (Dependencies)……………………………………………………………………………………………………. 191

Каскадная очистка (Cascade cleanup)……………………………………………………………………………………. 193

Гонки данных (Data race)………………………………………………………………………………………………………… 194

Память-безопасные алгоритмы (Memory-safe algorithms)…………………………………………………… 195

Внутренняя изменяемость (Interior mutability)………………………………………………………………………. 196

Регистры процессора (CPU registers)………………………………………………………………………………………. 197

Отображение памяти (Memory mapping)………………………………………………………………………………. 198

Динамическая оперативная память (DRAM, Dynamic Random Access Memory)………………. 199

Прямой доступ к памяти (DMA, Direct memory access)………………………………………………………… 199

Выравнивание (Alignment)………………………………………………………………………………………………………. 200

Жизненный цикл инструкций………………………………………………………………………………………………….. 201

Предвыборка данных (Prefetching)…………………………………………………………………………………………. 203

Стек и куча (Stack vs Heap)…………………………………………………………………………………………………….. 204

Линейный аллокатор (Linear allocator)………………………………………………………………………………….. 205

Линейный аллокатор с откатом (Step-back allocator)…………………………………………………………… 208

Фреймовый аллокатор (Frame allocator)……………………………………………………………………………….. 210

Двойной фреймовый аллокатор (Double-frame allocator)…………………………………………………….. 212

Пример несогласованного поведения…………………………………………………………………………….. 215

N-фреймовый аллокатор (N-Frame allocator)………………………………………………………………………… 217

Стековый аллокатор (Stack allocator)……………………………………………………………………………………. 218

Двойной стековый аллокатор (Double-stack allocator)…………………………………………………………. 223

Двойной стековый аллокатор с общим началом (Pointed Double-Stack Allocator)……………. 227

Тройной стековый аллокатор (Triple-stack allocator)……………………………………………………………. 229

Пул памяти (Pool allocator)……………………………………………………………………………………………………… 233

Аллокатор со списком свободных блоков (Free list allocator)………………………………………………. 238

Аллокатор со свободными блоками под разные размеры (Segregated free lists)………………… 243

Парадокс скорости vs фрагментации…………………………………………………………………………………….. 246

Аллокатор готовых объектов (Slab-allocator)……………………………………………………………………….. 246

Аллокатор методом близнецов (Buddy allocator)…………………………………………………………………. 248

Арена объектов (Region-Based allocator)……………………………………………………………………………….. 251

Аллокатор с локальным кэшем для потока (Thread-cache allocator)………………………………….. 257

Фибоначчи аллокатор (Fibonacci allocator)…………………………………………………………………………… 261

Сжимающий аллокатор (Compacting allocator)……………………………………………………………………. 264

Двухуровневый аллокатор с разделением по размерам (Two-Level Segregated Fit)………….. 267

“Цветной” аллокатор (Color-based allocator)…………………………………………………………………………. 271

Аллокатор с отслеживанием времени жизни
(TTL Allocator, Time-to-live, Tracked- time-live)……………………………………………………………………… 273

Аллокатор с агрессивной рандомизацией адресов (Chaos allocator)…………………………………. 273

Аллокаторы != “серебряная пуля”………………………………………………………………………………………….. 275

0x24. Оптимизации контейнеров………………………………………………………….. 277

Контейнеры………………………………………………………………………………………………………………………………. 277

Инвалидация итераторов………………………………………………………………………………………………………… 278

Фиксированный массив (Fixed array)……………………………………………………………………………………… 279

Матрица (Matrix)……………………………………………………………………………………………………………………… 281

Неравномерная матрица (Ragged matrix, jagged arrays)………………………………………………………. 282

Динамическая матрица (Dynamic matrix)……………………………………………………………………………… 285

Динамический массив (Dynamic array, vector)………………………………………………………………………. 286

Стабильный вектор (Stable vector)…………………………………………………………………………………………. 288

Разреженный массив (Sparse array/vector)…………………………………………………………………………….. 292

Парадокс “ленивой сортировки”…………………………………………………………………………………….. 294

Упакованный вектор (Packed vector)……………………………………………………………………………………… 294

Гибридный вектор (Small/Hybrid vector)……………………………………………………………………………….. 296

Парадокс малых размеров………………………………………………………………………………………………. 300

Массив с отложенным удалением (Dirty vector)……………………………………………………………………. 300

Массив с чередованием (Buddy array)…………………………………………………………………………………… 304

Двусторонняя очередь (Deque, Double Ended Queue)…………………………………………………………… 306

Двусторонняя очередь со сжатием (Block-compressed deque)…………………………………………….. 308

Двусторонняя очередь с приоритетами (Bounded priority deque)……………………………………….. 310

Интрузивная двусторонняя очередь/список (Intrusive deque/list)………………………………………… 313

Пополняемый массив (Expandable vector)…………………………………………………………………………….. 316

Структурированное дерево данных (LSM, Level structured merge)…………………………………….. 318

Октодерево (Octree)………………………………………………………………………………………………………………….. 320

Квадродерево (Quadtree/btree)……………………………………………………………………………………………….. 325

Кольцевой буфер (Circular buffer)…………………………………………………………………………………………… 326

Хеш-таблица с мемоизацией (Memoization hashtable)…………………………………………………………. 330

Массив дескрипторов (Handle array)……………………………………………………………………………………… 333

Текстурный атлас (Texture atlas)……………………………………………………………………………………………. 337

Слотовый массив (Slot array)………………………………………………………………………………………………….. 341

0x25. Нескучное программирование…………………………………………………….. 345

Что такое нескучное программирование (Heapless programming)………………………………………. 345

Стек (Stack)………………………………………………………………………………………………………………………………. 353

Динамическая память (Heap)………………………………………………………………………………………………….. 359

Статическая память (Static)…………………………………………………………………………………………………….. 365

Компромиссы динамических объектов………………………………………………………………………………….. 367

Детерминизм стека…………………………………………………………………………………………………………………… 369

Утечки и оптимизации…………………………………………………………………………………………………………….. 370

Не использовать new?……………………………………………………………………………………………………………… 371

Локальные строки……………………………………………………………………………………………………………………. 373

Локальный полиморфизм (Ad-hoc polymorphism)………………………………………………………………… 375

std::get_if…………………………………………………………………………………………………………………………… 376

std::visit……………………………………………………………………………………………………………………………… 377

std::variant::index……………………………………………………………………………………………………………… 378

Оптимизируем векторы……………………………………………………………………………………………………………. 379

Оптимизация тайловой карты………………………………………………………………………………………………… 386

Работа с размеченной памятью (Preallocations)……………………………………………………………………. 388

“Тяжелые” логи………………………………………………………………………………………………………………………… 392

Часть III. Библиотека C++…………………………………………………………… 397

0x30. STL и алгоритмы…………………………………………………………………………. 399

Нестандартные стандарты…………………………………………………………………………………………………….. 399

Использование SIMD………………………………………………………………………………………………………………. 402

Алгоритмы………………………………………………………………………………………………………………………………… 404

Ортогональность данных и алгоритмов………………………………………………………………………………… 407

Итераторы………………………………………………………………………………………………………………………………… 409

Кэширование шейдеров (практический пример)………………………………………………………………….. 413

Как сделать через алгоритмы?……………………………………………………………………………………….. 415

Часто используемые алгоритмы…………………………………………………………………………………………….. 415

all_of………………………………………………………………………………………………………………………………….. 416

all_of (вредные советы)……………………………………………………………………………………………………. 417

any_of………………………………………………………………………………………………………………………………… 418

any_of (вредные советы)………………………………………………………………………………………………….. 419

find, find_if, find_if_not……………………………………………………………………………………………………. 420

find (вредные советы)………………………………………………………………………………………………………. 420

adjacent_find…………………………………………………………………………………………………………………….. 422

adjacent_find (вредные советы)………………………………………………………………………………………. 423

move, move_backward……………………………………………………………………………………………………….. 424

move (вредные советы)…………………………………………………………………………………………………….. 425

copy, copy_n, copy_if, copy_backward…………………………………………………………………………….. 425

count, count_if…………………………………………………………………………………………………………………… 426

count (вредные советы)……………………………………………………………………………………………………. 426

mismatch…………………………………………………………………………………………………………………………….. 427

mismatch (вредные советы)………………………………………………………………………………………………. 428

equal………………………………………………………………………………………………………………………………….. 429

equal (вредные советы)……………………………………………………………………………………………………. 429

is_permutation…………………………………………………………………………………………………………………… 431

is_permutation (вредные советы)…………………………………………………………………………………….. 431

search, search_n………………………………………………………………………………………………………………… 433

search (вредные советы)…………………………………………………………………………………………………… 433

replace, replace_if, replace_copy, replace_copy_if…………………………………………………………. 434

replace (вредные советы)…………………………………………………………………………………………………. 435

transform……………………………………………………………………………………………………………………………. 436

transform (вредные советы)……………………………………………………………………………………………… 437

remove, remove_if, remove_copy, remove_copy_if……………………………………………………………. 438

remove (вредные советы)………………………………………………………………………………………………….. 439

unique, unique_copy…………………………………………………………………………………………………………. 439

unique (вредные советы)………………………………………………………………………………………………….. 440

fill, fill_n……………………………………………………………………………………………………………………………. 441

fill (вредные советы)………………………………………………………………………………………………………… 441

generate, generate_n…………………………………………………………………………………………………………. 442

generate (вредные советы)……………………………………………………………………………………………….. 443

sort, partial_sort………………………………………………………………………………………………………………… 443

partial_sort (вредные советы)………………………………………………………………………………………….. 445

nth_element……………………………………………………………………………………………………………………….. 446

nth_element (вредные советы)…………………………………………………………………………………………. 446

reverse, reverse_copy…………………………………………………………………………………………………………. 447

merge………………………………………………………………………………………………………………………………….. 448

merge (вредные советы)……………………………………………………………………………………………………. 449

Часть IV. Многопоточность…………………………………………………….. 451

0x40. Мультипоточное программирование…………………………………………… 453

Конкурентность (Concurrency)……………………………………………………………………………………………….. 453

Масштабируемость (Scalability)…………………………………………………………………………………………….. 454

Cоперничество за ресурс (Contention)…………………………………………………………………………………… 455

Изолированное состояние (Separate state)…………………………………………………………………………….. 456

Общее состояние (Shared state)………………………………………………………………………………………………. 457

Копия состояния (Shadow state)……………………………………………………………………………………………… 458

Работа с потоками…………………………………………………………………………………………………………………… 459

Аналогия с реальным миром…………………………………………………………………………………………… 460

Проблемы потоков…………………………………………………………………………………………………………… 461

История одного бага, или многопоточный AI, который всех победил……………………………….. 465

Неблокирующая логика………………………………………………………………………………………………….. 465

Как было до С++11?………………………………………………………………………………………………………………… 467

Неблокирующие алгоритмы (non-blocking, lock-free, wait-free)…………………………………………… 471

Зачем куда-то уходить от мьютексов?…………………………………………………………………………………… 473

Атомарные операции………………………………………………………………………………………………………………. 475

Спинлок…………………………………………………………………………………………………………………………………….. 476

“Голодание” потоков (Thread starvation)……………………………………………………………………………….. 477

Алгоритмическое “голодание”………………………………………………………………………………………… 478

Эффекты кэша…………………………………………………………………………………………………………………… 479

Хороший спинлок для игры…………………………………………………………………………………………………….. 495

Практические советы………………………………………………………………………………………………………………. 498

Задачи (Tasks)………………………………………………………………………………………………………………………….. 500

Подвисания, подтормаживания (Hitching, Stutters)……………………………………………………………….. 502

Обращение к системе ресурсов (I/O hitching)………………………………………………………………… 502

Неправильная работа с потоками (Thread hitching)……………………………………………………… 503

Сборка мусора (GC hitching)…………………………………………………………………………………………… 504

Проблемы железа (Graphics hitching/stutters)…………………………………………………………………. 504

Рабочие потоки (Workers)……………………………………………………………………………………………………….. 505

Схема “один поток на ядро”……………………………………………………………………………………………. 505

Схема “два потока на ядро”……………………………………………………………………………………………. 507

Модель независимых задач (Embarrassingly Parallel Model)………………………………………………… 508

Модель с выборкой данных (Stateless workers)……………………………………………………………………… 511

Цепочки задач (Workers chain)……………………………………………………………………………………………….. 512

Часть V. Паттерны………………………………………………………………………… 521

0x50. Паттерны разработки………………………………………………………………….. 523

Фреймворки умирают, математика не стареет……………………………………………………………………… 523

Cиняя книга………………………………………………………………………………………………………………………………. 525

Синдром фломастера………………………………………………………………………………………………………………. 527

Уровни паттернов……………………………………………………………………………………………………………………. 528

Команда (Command)……………………………………………………………………………………………………………….. 530

Недостатки……………………………………………………………………………………………………………………….. 533

Возможности для расширения………………………………………………………………………………………… 533

Совместимость…………………………………………………………………………………………………………………. 534

Плохие примеры внедрения…………………………………………………………………………………………….. 534

Состояние (State)……………………………………………………………………………………………………………………… 536

Конечный автомат (Finite State Machine)………………………………………………………………………………. 537

Детерминированный конечный автомат (Deterministic [basic] FSM)…………………………… 539

Недетерминированный конечный автомат (Nondeterministic FSM)…………………………….. 540

Автомат состояний со стеком (FSM + pushdown states)………………………………………………… 541

Конечный автомат на основе состояний (State-based/Object-model FSM)…………………. 542

Возможности для расширения………………………………………………………………………………………… 544

Влияние на архитектуру…………………………………………………………………………………………………. 545

Недостатки……………………………………………………………………………………………………………………….. 546

Плохие примеры использования…………………………………………………………………………………….. 547

Разделяемый объект / Приспособленец (Flyweight)………………………………………………………………. 549

Влияние на архитектуру…………………………………………………………………………………………………. 551

Недостатки……………………………………………………………………………………………………………………….. 552

Совместимость…………………………………………………………………………………………………………………. 553

Плохие примеры использования…………………………………………………………………………………….. 553

Наблюдатель (Observer)………………………………………………………………………………………………………….. 555

Возможности для расширения………………………………………………………………………………………… 559

Влияние на архитектуру…………………………………………………………………………………………………. 560

Недостатки……………………………………………………………………………………………………………………….. 560

Совместимость…………………………………………………………………………………………………………………. 561

Примеры плохого использования…………………………………………………………………………………… 562

Шина событий (Event bus)………………………………………………………………………………………………………. 564

Возможности для расширения………………………………………………………………………………………… 566

Влияние на архитектуру…………………………………………………………………………………………………. 567

Недостатки……………………………………………………………………………………………………………………….. 568

0x51. “Ленивая” логика……………………………………………………………………….. 569

Флаг изменения (Dirty flag)……………………………………………………………………………………………………… 569

Влияние на архитектуру…………………………………………………………………………………………………. 572

Недостатки……………………………………………………………………………………………………………………….. 572

Совместимость…………………………………………………………………………………………………………………. 573

Примеры плохого использования…………………………………………………………………………………… 574

Слой логики (Update layer)……………………………………………………………………………………………………… 576

Ближний слой (Close Layer)…………………………………………………………………………………………….. 576

Средний слой (Mid Layer)……………………………………………………………………………………………….. 577

Дальний слой (Far Layer)…………………………………………………………………………………………………. 577

“Замороженные” объекты (Frozen Layer)……………………………………………………………………….. 578

Реализация………………………………………………………………………………………………………………………… 579

Влияние на архитектуру…………………………………………………………………………………………………. 580

Недостатки……………………………………………………………………………………………………………………….. 580

Совместимость…………………………………………………………………………………………………………………. 581

Примеры плохого использования…………………………………………………………………………………… 581

Что дальше?……………………………………………………………………………………………………………………………… 583

0xFF. Игры — это искусство………………………………………………………………… 585

Предметный указатель…………………………………………………………………………. 587

Об авторе……………………………………………………………………………………………… 591

Опубликовано

Новинка: “Современный C#. Разработка настольных, облачных, мобильных и веб-приложений”

Современный C#. Разработка настольных, облачных, мобильных и веб-приложений

Это новое издание фундаментальной книги Иэна Гриффитса по языку C# и платформе .NET на примере версий C# 12 и .NET 8. Книга  много лет остается настольными для .NET-разработчиков и является одним из наиболее подробных справочников по C# и .NET, учитывающим всевозможные нюансы программирования и поддержки приложений для платформ Microsoft. Рассмотрены новейшие возможности языка, особое внимание уделяется структуре языка C#, структурам данных, принципам объектно-ориентированного программирования. Отдельные главы посвящены работе с обобщенными типами, асинхронному выполнению кода, работе с памятью и разнообразным библиотекам классов, языку запросов LINQ.

Для специалистов по C# и .NET

Книга поможет вам:

  • Понять, как платформа .NET изменилась за последние годы и как это отражается на разработке приложений
  • Актуализировать информацию об объектно-ориентированном программировании на платформе .NET
  • Подбирать подходящие языковые возможности C# для решения любой задачи
  • Решать, когда лучше воспользоваться новыми возможностями, а когда придерживаться старых
  • Исследовать весь спектр функциональных возможностей применяемых в .NET библиотек классов
  • Использовать библиотеки классов для решения задач прикладного программирования
  • Разобраться с многочисленными небольшими нововведениями .NET, благодаря которым код становится гораздо выразительнее

Книга предсказуемо отличная.
Стивен Тауб, главный архитектор в компании Microsoft

В книге разобрано самое ядро языка — как раз тот материал, который необходим для создания хорошего ПО. Книга подробная, тщательно проработанная и затрагивает именно те языковые тонкости и нюансы, которым редко уделяется внимание в других книгах. Здесь всё, что нужно знать о C#.
Джереми Морган, программист, DevOps

Иэн Гриффитс

Иэн Гриффитс (Ian Griffiths) — признанный эксперт в мире информационных технологий, чье имя является синонимом глубокого понимания и мастерства в работе с платформой Microsoft.
Более 20 лет Иэн посвятил проектированию и разработке сложных программных систем, консультированию и обучению специалистов. Его карьера — это яркий путь от ведущего разработчика и архитектора до сооснователя и ключевого технического советника в endjin, британской консалтинговой компании, специализирующейся на передовых решениях в области данных, искусственного интеллекта и облачных технологий.
Иэн является не только практикующим профессионалом высочайшего класса, но и блестящим преподавателем и автором. Он обладает уникальным даром — разлагать самые сложные концепции на понятные и логичные составляющие. Это качество сделало его одним из самых востребованных инструкторов в знаменитой серии курсов O’Reilly, где его лекции по C# и платформе .NET считаются золотым стандартом.
Именно этот богатейший опыт — глубокая практика, экспертные знания и страсть к преподаванию — лег в основу книги «Современный C#». Иэн Гриффитс не просто рассказывает о языке; он погружает читателя в самую суть, учит мыслить как настоящий профессионал и создавать элегантные, эффективные и надежные приложения для любых задач.

Книгу “Современный C#. Разработка настольных, облачных, мобильных и веб-приложений” можно купить в нашем интенет-магазине.

Предисловие…………………………………………………………………………………………… 19

Для кого предназначена эта книга…………………………………………………………………………………………… 19

Условные обозначения, используемые в этой книге………………………………………………………………. 19

Использование примеров кода…………………………………………………………………………………………………. 20

Онлайн-обучение O’Reilly………………………………………………………………………………………………………….. 21

Как с нами связаться………………………………………………………………………………………………………………….. 21

Благодарности……………………………………………………………………………………….. 22

Глава 1. Введение в C#…………………………………………………………………………… 23

Почему именно C#?……………………………………………………………………………………………………………………. 24

Управляемый код и CLR………………………………………………………………………………………………… 26

C# предпочитает общность, а не специфичность………………………………………………………… 28

Стандарты и реализации C#…………………………………………………………………………………………………….. 29

Семейство .NET………………………………………………………………………………………………………………. 29

Циклы выпуска и долгосрочная поддержка………………………………………………………………… 31

Ориентир на несколько сред выполнения .NET…………………………………………………………… 32

Visual Studio, Visual Studio Code и JetBrains Rider…………………………………………………………………… 34

Анатомия простой программы…………………………………………………………………………………………………. 37

Написание модульного теста………………………………………………………………………………………… 41

Пространства имен…………………………………………………………………………………………………………. 46

Пространства имен и имена компонентов……………………………………………………………. 49

Разрешение неоднозначности……………………………………………………………………………….. 49

Вложенные пространства имен…………………………………………………………………………….. 50

Классы…………………………………………………………………………………………………………………………….. 51

Модульные тесты53

Резюме…………………………………………………………………………………………………………………………………………. 54

Глава 2. Основы программирования на C#……………………………………………. 55

Локальные переменные…………………………………………………………………………………………………………….. 56

Область видимости…………………………………………………………………………………………………………. 61

Неоднозначность имени переменной……………………………………………………………………………. 62

Экземпляры локальных переменных……………………………………………………………………………. 64

Операторы и выражения…………………………………………………………………………………………………………… 65

Операторы………………………………………………………………………………………………………………………. 65

Выражения………………………………………………………………………………………………………………………. 67

Комментарии и пробелы…………………………………………………………………………………………………………… 73

Директивы препроцессора………………………………………………………………………………………………………… 75

Символы компиляции…………………………………………………………………………………………………….. 75

Директивы #error и #warning………………………………………………………………………………………… 76

Директива #line………………………………………………………………………………………………………………. 77

Директива #pragma………………………………………………………………………………………………………… 77

Директива #nullable……………………………………………………………………………………………………….. 78

Директивы #region и #endregion…………………………………………………………………………………… 78

Основные типы данных…………………………………………………………………………………………………………….. 79

Числовые типы………………………………………………………………………………………………………………… 80

Числовые преобразования…………………………………………………………………………………….. 84

Проверяемый контекст…………………………………………………………………………………………… 87

Типы BigInteger, Int128, UInt128 и Half………………………………………………………………… 89

Логические значения………………………………………………………………………………………………………. 91

Строки и символы…………………………………………………………………………………………………………… 91

Неизменяемость строк……………………………………………………………………………………………. 93

Методы работы со строками………………………………………………………………………………… 93

Форматирование данных в строках……………………………………………………………………… 94

Дословные строковые литералы…………………………………………………………………………… 99

Необработанные строковые литералы……………………………………………………………… 101

Строковые литералы UTF-8………………………………………………………………………………… 103

Кортежи…………………………………………………………………………………………………………………………. 104

Деконструкция кортежа……………………………………………………………………………………………….. 107

Тип dynamic…………………………………………………………………………………………………………………… 108

Тип object………………………………………………………………………………………………………………………. 109

Операторы………………………………………………………………………………………………………………………………… 109

Управление потоком выполнения………………………………………………………………………………………….. 115

Принятие решений с операторами if…………………………………………………………………………… 116

Множественный выбор с операторами switch…………………………………………………………… 118

Циклы: while и do………………………………………………………………………………………………………….. 120

Циклы в стиле языка С…………………………………………………………………………………………………. 121

Перебор коллекции циклом foreach……………………………………………………………………………. 123

Шаблоны………………………………………………………………………………………………………………………………….. 124

Объединение и отрицание шаблонов…………………………………………………………………………. 131

Шаблоны отношений…………………………………………………………………………………………………… 132

Уточнение с помощью when………………………………………………………………………………………… 133

Шаблоны в выражениях………………………………………………………………………………………………. 133

Резюме………………………………………………………………………………………………………………………………………. 136

Глава 3. Типы………………………………………………………………………………………. 137

Классы………………………………………………………………………………………………………………………………………. 137

Входные данные инициализации……………………………………………………………………………….. 140

Статические члены………………………………………………………………………………………………………. 141

Статические классы……………………………………………………………………………………………………… 143

Записи……………………………………………………………………………………………………………………………………….. 145

Ссылки и значения null……………………………………………………………………………………………………………. 150

Удаление Null с помощью не-nullable ссылочных типов…………………………………………………….. 154

Структуры………………………………………………………………………………………………………………………………… 163

Когда писать тип значения………………………………………………………………………………………….. 167

Гарантия неизменяемости……………………………………………………………………………………………. 171

Структуры записи………………………………………………………………………………………………………… 172

Класс, структура, запись или кортеж?…………………………………………………………………………………… 173

Члены типов……………………………………………………………………………………………………………………………… 175

Доступность………………………………………………………………………………………………………………….. 175

Поля……………………………………………………………………………………………………………………………….. 175

Конструкторы……………………………………………………………………………………………………………….. 177

Конструкторы по умолчанию и конструкторы без параметров……………………… 180

Цепочка конструкторов……………………………………………………………………………………….. 183

Статические конструкторы…………………………………………………………………………………. 185

Деконструкторы……………………………………………………………………………………………………………. 190

Методы………………………………………………………………………………………………………………………….. 192

Передача аргументов по ссылке…………………………………………………………………………. 192

Ссылочные переменные и возвращаемые значения…………………………………………. 198

Необязательные аргументы………………………………………………………………………………… 201

Перегрузка…………………………………………………………………………………………………………….. 202

Переменное количество аргументов с ключевым словом params……………………. 203

Локальные функции……………………………………………………………………………………………… 205

Однострочные методы…………………………………………………………………………………………. 206

Методы расширения……………………………………………………………………………………………. 207

Свойства………………………………………………………………………………………………………………………… 208

Синтаксис инициализатора………………………………………………………………………………… 212

Свойства только для инициализации…………………………………………………………………. 213

Обязательные свойства……………………………………………………………………………………….. 215

Вычисляемые свойства………………………………………………………………………………………… 216

Свойства и изменяемые типы значений……………………………………………………………… 216

Индексаторы…………………………………………………………………………………………………………. 219

Операторы…………………………………………………………………………………………………………………….. 221

События…………………………………………………………………………………………………………………………. 224

Вложенные типы…………………………………………………………………………………………………………… 224

Интерфейсы………………………………………………………………………………………………………………………………. 226

Реализация интерфейса по умолчанию……………………………………………………………………… 228

Статические виртуальные члены……………………………………………………………………………….. 230

Перечисления…………………………………………………………………………………………………………………………… 232

Другие типы……………………………………………………………………………………………………………………………… 235

Анонимные типы……………………………………………………………………………………………………………………… 235

Частичные типы и методы………………………………………………………………………………………………………. 237

Резюме………………………………………………………………………………………………………………………………………. 239

Глава 4. Обобщенные типы…………………………………………………………………. 240

Обобщенные типы……………………………………………………………………………………………………………………. 240

Ограничения…………………………………………………………………………………………………………………………….. 243

Ограничения типа…………………………………………………………………………………………………………. 244

Ограничения типа ссылки……………………………………………………………………………………………. 246

Ограничения типа значения………………………………………………………………………………………… 249

Типы значений с ограничением unmanaged………………………………………………………………. 249

Ограничение NotNull……………………………………………………………………………………………………. 250

Другие специальные ограничения типа……………………………………………………………………… 250

Множественные ограничения……………………………………………………………………………………… 250

Значения, подобные нулю………………………………………………………………………………………………………. 251

Обобщенные методы……………………………………………………………………………………………………………….. 252

Вывод типа……………………………………………………………………………………………………………………………….. 253

Обобщенная математика………………………………………………………………………………………………………… 254

Обобщенные математические интерфейсы…………………………………………………………………………… 257

Интерфейсы числовых категорий……………………………………………………………………………….. 257

Интерфейсы операторов………………………………………………………………………………………………. 262

Интерфейсы функций……………………………………………………………………………………………………. 263

Парсинг и форматирование…………………………………………………………………………………………. 263

Обобщения и кортежи……………………………………………………………………………………………………………… 264

Резюме………………………………………………………………………………………………………………………………………. 265

Глава 5. Коллекции……………………………………………………………………………… 266

Массивы……………………………………………………………………………………………………………………………………. 266

Инициализация массива………………………………………………………………………………………………. 269

Поиск и сортировка………………………………………………………………………………………………………. 272

Многомерные массивы………………………………………………………………………………………………… 276

Зубчатые массивы……………………………………………………………………………………………….. 277

Прямоугольные массивы……………………………………………………………………………………… 279

Копирование и изменение размера…………………………………………………………………………….. 280

Класс List<Т>…………………………………………………………………………………………………………………………… 281

Интерфейсы списков и последовательностей……………………………………………………………………….. 285

Реализация списков и последовательностей…………………………………………………………………………. 291

Реализация IEnumerable<T> с итераторами……………………………………………………………… 291

Тип Collection<Т>………………………………………………………………………………………………………… 296

Тип ReadOnlyCollection<T>………………………………………………………………………………………… 297

Обращение по индексу или диапазону………………………………………………………………………………….. 297

Тип System.Index……………………………………………………………………………………………………………. 298

Тип System.Range………………………………………………………………………………………………………….. 300

Поддержка Index и Range в собственных типах………………………………………………………… 303

Словари…………………………………………………………………………………………………………………………………….. 305

Сортированные словари…………………………………………………………………………………………………………. 309

Множества……………………………………………………………………………………………………………………………….. 310

Очереди и стеки……………………………………………………………………………………………………………………….. 311

Связанные списки…………………………………………………………………………………………………………………….. 312

Конкурентные коллекции……………………………………………………………………………………………………….. 313

Неизменяемые коллекции……………………………………………………………………………………………………….. 314

“Замороженные” коллекции……………………………………………………………………………………………………. 317

Резюме………………………………………………………………………………………………………………………………………. 318

Глава 6. Наследование…………………………………………………………………………. 319

Наследование и преобразования…………………………………………………………………………………………… 320

Наследование интерфейса……………………………………………………………………………………………………… 323

Обобщения……………………………………………………………………………………………………………………………….. 325

Ковариантность и контравариантность………………………………………………………………………………… 326

Тип System.Object……………………………………………………………………………………………………………………… 331

Вездесущие методы System.Object………………………………………………………………………………………….. 332

Доступность и наследование………………………………………………………………………………………………….. 333

Виртуальные методы………………………………………………………………………………………………………………. 334

Абстрактные методы……………………………………………………………………………………………………. 337

Наследование и управление версиями библиотек…………………………………………………….. 338

Статические виртуальные методы……………………………………………………………………………… 343

Ограничения по умолчанию………………………………………………………………………………………… 345

Запечатанные методы и классы…………………………………………………………………………………………….. 347

Доступ к членам базового класса………………………………………………………………………………………….. 349

Наследование и конструкторы………………………………………………………………………………………………. 350

Первичные конструкторы……………………………………………………………………………………………. 352

Обязательные свойства………………………………………………………………………………………………… 354

Инициализация поля…………………………………………………………………………………………………….. 356

Записи……………………………………………………………………………………………………………………………………….. 357

Записи, наследование и ключевое слово with………………………………………………………………………. 359

Специальные базовые типы……………………………………………………………………………………………………. 360

Резюме………………………………………………………………………………………………………………………………………. 361

Глава 7. Время жизни объекта……………………………………………………………… 362

Сборка мусора…………………………………………………………………………………………………………………………. 362

Определение достижимости………………………………………………………………………………………… 365

Сборщик не всегда побеждает…………………………………………………………………………………….. 367

Слабые ссылки……………………………………………………………………………………………………………… 369

Возвращение памяти……………………………………………………………………………………………………. 373

Снижение нагрузки с помощью встроенных массивов……………………………………………… 378

Режимы сборщика мусора…………………………………………………………………………………………… 380

Временная приостановка сборки мусора…………………………………………………………………… 383

Случайное разрушительное сжатие…………………………………………………………………………… 384

Принудительная сборка мусора…………………………………………………………………………………. 387

Деструкторы и финализация…………………………………………………………………………………………………… 388

Интерфейс IDisposable…………………………………………………………………………………………………………….. 391

Необязательная утилизация…………………………………………………………………………………………………… 399

Упаковка…………………………………………………………………………………………………………………………………… 399

Упаковка nullable<T>…………………………………………………………………………………………………………….. 404

Резюме           405

Глава 8. Исключения……………………………………………………………………………. 406

Источники исключений…………………………………………………………………………………………………………… 408

Исключения из API……………………………………………………………………………………………………….. 409

Ошибки времени выполнения………………………………………………………………………………………. 411

Обработка исключений…………………………………………………………………………………………………………… 412

Объекты исключений……………………………………………………………………………………………………. 413

Множественные блоки catch……………………………………………………………………………………….. 415

Фильтры исключений…………………………………………………………………………………………………… 416

Вложенные блоки try……………………………………………………………………………………………………. 418

Блоки finally………………………………………………………………………………………………………………….. 419

Выброс исключений………………………………………………………………………………………………………………… 421

Повторная генерация исключений……………………………………………………………………………… 423

Быстрые ошибки…………………………………………………………………………………………………………… 425

Типы исключений…………………………………………………………………………………………………………………….. 426

Пользовательские исключения……………………………………………………………………………………………….. 428

Необработанные исключения………………………………………………………………………………………………… 430

Резюме………………………………………………………………………………………………………………………………………. 432

Глава 9. Делегаты, лямбда-выражения и события………………………………… 433

Типы делегатов………………………………………………………………………………………………………………………… 434

Создание делегата……………………………………………………………………………………………………….. 436

Множественные делегаты……………………………………………………………………………………………. 440

Вызов делегата……………………………………………………………………………………………………………… 441

Распространенные типы делегатов…………………………………………………………………………….. 442

Совместимость типов…………………………………………………………………………………………………… 444

За кадром………………………………………………………………………………………………………………………. 446

Анонимные функции………………………………………………………………………………………………………………… 448

Лямбда-выражения и аргументы по умолчанию………………………………………………………. 451

Захват переменных………………………………………………………………………………………………………. 454

Лямбда-выражения и деревья выражений………………………………………………………………….. 462

События……………………………………………………………………………………………………………………………………. 464

Стандартный паттерн делегата события…………………………………………………………………… 466

Пользовательские методы добавления и удаления…………………………………………………… 467

События и сборщик мусора…………………………………………………………………………………………. 470

События и делегаты……………………………………………………………………………………………………… 471

Делегаты против интерфейсов……………………………………………………………………………………………….. 472

Резюме………………………………………………………………………………………………………………………………………. 473

Глава 10. LINQ…………………………………………………………………………………….. 474

Выражения запроса…………………………………………………………………………………………………………………. 475

Как расписываются выражения запроса………………………………………………………………………………. 478

Отложенное вычисление…………………………………………………………………………………………………………. 480

LINQ, обобщения и IQueryable<T>………………………………………………………………………………………… 482

Стандартные операторы LINQ………………………………………………………………………………………………. 485

Фильтрация…………………………………………………………………………………………………………………… 486

Оператор Select…………………………………………………………………………………………………………….. 489

Формирование данных и анонимные типы……………………………………………………….. 490

Проекция и картографирование………………………………………………………………………….. 492

Оператор SelectMany……………………………………………………………………………………………………. 492

Сортировка……………………………………………………………………………………………………………………. 495

Проверка на наличие……………………………………………………………………………………………………. 498

Конкретные элементы и поддиапазоны……………………………………………………………………… 499

Операции, сохраняющие последовательность и порядок………………………………………… 504

Агрегация………………………………………………………………………………………………………………………. 504

Группировка…………………………………………………………………………………………………………………. 509

Преобразование……………………………………………………………………………………………………………. 514

Генерация последовательности……………………………………………………………………………………………… 519

Другие реализации LINQ………………………………………………………………………………………………………… 519

Entity Framework Core………………………………………………………………………………………………….. 519

Parallel LINQ (PLINQ)……………………………………………………………………………………………………. 520

LINQ to XML…………………………………………………………………………………………………………………. 520

IAsyncEnumerable<T>………………………………………………………………………………………………….. 521

Реактивные расширения………………………………………………………………………………………………. 521

Резюме………………………………………………………………………………………………………………………………………. 521

Глава 11. Rx: Реактивные расширения………………………………………………… 522

Фундаментальные интерфейсы………………………………………………………………………………………………. 524

Интерфейс IObserver<T>……………………………………………………………………………………………… 525

Интерфейс IObservable<T>………………………………………………………………………………………….. 526

Реализация холодного источника………………………………………………………………………. 527

Реализация горячего источника………………………………………………………………………….. 530

Публикация и подписка с использованием делегатов………………………………………………………….. 533

Создание наблюдаемого источника с помощью делегатов……………………………………… 533

Подписка на наблюдаемый источник с помощью делегата…………………………………….. 536

Создание последовательностей……………………………………………………………………………………………… 537

Empty……………………………………………………………………………………………………………………………… 538

Never………………………………………………………………………………………………………………………………. 538

Return…………………………………………………………………………………………………………………………….. 538

Throw……………………………………………………………………………………………………………………………… 539

Range……………………………………………………………………………………………………………………………… 539

Repeat…………………………………………………………………………………………………………………………….. 539

Generate…………………………………………………………………………………………………………………………. 539

Запросы LINQ………………………………………………………………………………………………………………………….. 540

Операторы группировки………………………………………………………………………………………………. 543

Операторы объединения……………………………………………………………………………………………… 544

Оператор SelectMany……………………………………………………………………………………………………. 547

Агрегация и другие операторы с одним значением…………………………………………………… 547

Оператор Concat…………………………………………………………………………………………………………… 548

Операторы запроса Rx……………………………………………………………………………………………………………. 549

Merge……………………………………………………………………………………………………………………………… 549

Оконные операторы……………………………………………………………………………………………………… 551

Операторы Window и Buffer………………………………………………………………………………… 553

Разметка окон с наблюдаемыми объектами………………………………………………………. 556

Оператор Scan………………………………………………………………………………………………………………. 557

Оператор Amb……………………………………………………………………………………………………………….. 558

Оператор DistinctUntilChanged…………………………………………………………………………………… 559

Планировщики…………………………………………………………………………………………………………………………. 559

Настройка планировщиков…………………………………………………………………………………………. 560

Метод ObserveOn………………………………………………………………………………………………….. 561

Метод SubscribeOn………………………………………………………………………………………………. 562

Явная передача планировщиков………………………………………………………………………… 562

Встроенные планировщики…………………………………………………………………………………………. 562

Субъекты………………………………………………………………………………………………………………………………….. 563

Subject<T>…………………………………………………………………………………………………………………….. 564

BehaviorSubject<T>……………………………………………………………………………………………………… 564

ReplaySubject<T>…………………………………………………………………………………………………………. 565

AsyncSubject<T>…………………………………………………………………………………………………………… 565

Адаптация………………………………………………………………………………………………………………………………… 565

IEnumerable<T> и IAsyncEnumerable<T>………………………………………………………………….. 566

События .NET……………………………………………………………………………………………………………….. 568

Асинхронные API…………………………………………………………………………………………………………. 569

Временные последовательности……………………………………………………………………………………………. 571

Источники с заданным временем………………………………………………………………………………… 571

Операторы с заданным временем……………………………………………………………………………….. 572

Операторы временного окна……………………………………………………………………………………….. 573

Reaqtor — Rx как сервис…………………………………………………………………………………………………………. 574

Резюме………………………………………………………………………………………………………………………………………. 576

Глава 12. Сборки и развертывание………………………………………………………. 577

Анатомия сборки……………………………………………………………………………………………………………………… 577

Метаданные .NET…………………………………………………………………………………………………………. 578

Ресурсы………………………………………………………………………………………………………………………….. 579

Многофайловые сборки……………………………………………………………………………………………….. 579

Другие возможности PE……………………………………………………………………………………………….. 579

Ресурсы в стиле Win32…………………………………………………………………………………………. 579

Консоль против графического интерфейса……………………………………………………….. 581

Идентичность типа………………………………………………………………………………………………………………….. 581

Развертывание………………………………………………………………………………………………………………………….. 584

Зависит от фреймворка………………………………………………………………………………………………… 585

Автономная модель………………………………………………………………………………………………………. 587

Усечение………………………………………………………………………………………………………………………… 587

Компиляция Ahead-of-Time (AOT)………………………………………………………………………………. 589

ReadyToRun………………………………………………………………………………………………………….. 589

Native АОТ…………………………………………………………………………………………………………….. 590

Загрузка сборок……………………………………………………………………………………………………………………….. 591

Разрешение сборки……………………………………………………………………………………………………….. 593

Явная загрузка………………………………………………………………………………………………………………. 595

Изоляция и плагины с помощью AssemblyLoadContext…………………………………………….. 596

Имена сборок……………………………………………………………………………………………………………………………. 598

Строгие имена………………………………………………………………………………………………………………. 598

Версия……………………………………………………………………………………………………………………………. 601

Номера версий и загрузка сборок……………………………………………………………………………….. 603

Культура……………………………………………………………………………………………………………………….. 604

Защита………………………………………………………………………………………………………………………………………. 608

Целевые фреймворки и .NET Standard……………………………………………………………………………………. 608

Резюме………………………………………………………………………………………………………………………………………. 610

Глава 13. Рефлексия…………………………………………………………………………….. 612

Типы рефлексии……………………………………………………………………………………………………………………….. 613

Класс Assembly……………………………………………………………………………………………………………… 615

Класс Module………………………………………………………………………………………………………………… 618

Тип MemberInfo…………………………………………………………………………………………………………….. 618

Type и TypeInfo………………………………………………………………………………………………………………. 621

Обобщенные типы………………………………………………………………………………………………………… 625

Классы MethodBase, ConstructorInfo и MethodInfo…………………………………………………… 626

Класс ParameterInfo……………………………………………………………………………………………………… 628

Класс FieldInfo……………………………………………………………………………………………………………… 628

Класс PropertyInfo………………………………………………………………………………………………………… 629

Класс EventInfo…………………………………………………………………………………………………………….. 629

Контексты рефлексии………………………………………………………………………………………………………………. 629

Резюме………………………………………………………………………………………………………………………………………. 631

Глава 14. Атрибуты……………………………………………………………………………… 633

Применение атрибутов……………………………………………………………………………………………………………. 633

Цели атрибутов…………………………………………………………………………………………………………….. 636

Атрибуты, обрабатываемые компилятором………………………………………………………………. 639

Имена и версии……………………………………………………………………………………………………… 640

Описание и сопутствующие ресурсы…………………………………………………………………. 641

Атрибуты информации о вызывающем объекте……………………………………………….. 642

Атрибуты, обрабатываемые CLR……………………………………………………………………………….. 646

Атрибут InternalsVisibleToAttribute……………………………………………………………………. 646

JIT-компиляция…………………………………………………………………………………………………….. 648

Атрибуты STAThread и MTAThread…………………………………………………………………….. 649

Атрибуты отладки………………………………………………………………………………………………………… 650

Атрибуты времени сборки…………………………………………………………………………………………… 650

Сериализация JSON без рефлексии…………………………………………………………………….. 650

Генерация регулярных выражений…………………………………………………………………….. 650

Внутреннее взаимодействие……………………………………………………………………………….. 651

Определение и использование атрибутов……………………………………………………………………………… 652

Типы атрибутов……………………………………………………………………………………………………………. 653

Получение атрибутов…………………………………………………………………………………………………… 654

Загрузка только метаданных………………………………………………………………………………………. 656

Обобщенные типы атрибутов…………………………………………………………………………………………………. 658

Резюме………………………………………………………………………………………………………………………………………. 658

Глава 15. Файлы и потоки……………………………………………………………………. 660

Класс Stream…………………………………………………………………………………………………………………………….. 661

Позиция и поиск……………………………………………………………………………………………………………. 662

Сброс……………………………………………………………………………………………………………………………… 663

Копирование…………………………………………………………………………………………………………………. 664

Свойство Length……………………………………………………………………………………………………………. 664

Утилизация……………………………………………………………………………………………………………………. 665

Асинхронная операция………………………………………………………………………………………………… 666

Конкретные типы потоков…………………………………………………………………………………………… 667

Один тип, много поведений………………………………………………………………………………………….. 668

Текстово-ориентированные типы…………………………………………………………………………………………… 669

Абстрактные классы TextReader и TextWriter……………………………………………………………. 670

Конкретные типы читателей и писателей………………………………………………………………….. 672

Классы StreamReader и StreamWriter…………………………………………………………………. 672

Классы StringReader и StringWriter……………………………………………………………………. 673

Кодирование…………………………………………………………………………………………………………………. 674

Кодировки кодовых страниц………………………………………………………………………………. 675

Использование кодировок напрямую…………………………………………………………………. 676

Файлы и каталоги……………………………………………………………………………………………………………………. 677

Класс FileStream…………………………………………………………………………………………………………… 677

Класс File………………………………………………………………………………………………………………………. 679

Класс Directory……………………………………………………………………………………………………………… 681

Класс Path…………………………………………………………………………………………………………………….. 682

Сериализация…………………………………………………………………………………………………………………………… 683

Классы BinaryReader, BinaryWriter и BinaryPrimitives……………………………………………… 683

Сериализация CLR……………………………………………………………………………………………………….. 684

JSON……………………………………………………………………………………………………………………………….. 685

Класс JsonSerializer……………………………………………………………………………………………… 686

JSON DOM…………………………………………………………………………………………………………….. 692

Резюме………………………………………………………………………………………………………………………………………. 695

Глава 16. Многопоточность………………………………………………………………….. 697

Потоки………………………………………………………………………………………………………………………………………. 697

Потоки, переменные и общее состояние…………………………………………………………………….. 698

Локальное хранилище потока…………………………………………………………………………………….. 702

Класс Thread…………………………………………………………………………………………………………………. 704

Пул потоков…………………………………………………………………………………………………………………… 706

Запуск задач в пуле потоков с помощью Task…………………………………………………… 706

Эвристика создания потока………………………………………………………………………………… 707

Привязка к потоку и SynchronizationContext……………………………………………………………… 708

Класс ExecutionContext……………………………………………………………………………………………….. 710

Синхронизация………………………………………………………………………………………………………………………… 712

Мониторы и ключевое слово lock……………………………………………………………………………….. 713

Как расширяется ключевое слово lock………………………………………………………………. 716

Ожидание и уведомление…………………………………………………………………………………….. 717

Тайм-ауты…………………………………………………………………………………………………………….. 719

Другие примитивы синхронизации…………………………………………………………………………….. 719

Класс Interlocked………………………………………………………………………………………………………….. 720

“Ленивая” инициализация……………………………………………………………………………………………. 722

Класс Lazy<T>……………………………………………………………………………………………………… 723

Класс LazyInitializer…………………………………………………………………………………………….. 724

Прочие средства поддержки конкурентности……………………………………………………………. 724

Задачи………………………………………………………………………………………………………………………………………. 726

Классы Task и Task<T>………………………………………………………………………………………………… 726

Типы ValueTask и ValueTask<T>………………………………………………………………………… 727

Способы создания задачи…………………………………………………………………………………… 729

Статус задачи………………………………………………………………………………………………………. 729

Получение результата…………………………………………………………………………………………. 730

Продолжения………………………………………………………………………………………………………………… 731

Планировщики………………………………………………………………………………………………………………. 734

Обработка ошибок……………………………………………………………………………………………………….. 735

Пользовательские задачи без потоков……………………………………………………………………….. 736

Отношения “родитель/ребенок”………………………………………………………………………………….. 737

Составные задачи………………………………………………………………………………………………………… 738

Другие асинхронные шаблоны………………………………………………………………………………………………. 738

Отмена………………………………………………………………………………………………………………………………………. 740

Параллелизм…………………………………………………………………………………………………………………………….. 740

Класс Parallel……………………………………………………………………………………………………………….. 740

Parallel LINQ………………………………………………………………………………………………………………….. 742

TPL Dataflow…………………………………………………………………………………………………………………. 742

Резюме………………………………………………………………………………………………………………………………………. 743

Глава 17. Асинхронные функции языка………………………………………………. 744

Ключевые слова: async и await………………………………………………………………………………………………. 745

Контексты выполнения и синхронизации………………………………………………………………….. 749

Множественные операции и циклы…………………………………………………………………………….. 751

Потребление и производство асинхронных последовательностей…………………. 754

Асинхронная утилизация…………………………………………………………………………………….. 756

Возврат задачи……………………………………………………………………………………………………………… 757

Применение async к вложенным методам…………………………………………………………………… 759

Шаблон await…………………………………………………………………………………………………………………………… 759

Обработка ошибок…………………………………………………………………………………………………………………… 764

Проверка аргументов…………………………………………………………………………………………………… 766

Единичные и множественные исключения…………………………………………………………………. 768

Конкурентные операции и пропущенные исключения…………………………………………….. 769

Резюме………………………………………………………………………………………………………………………………………. 770

Глава 18. Эффективная работа с памятью……………………………………………. 772

(Не) копируйте…………………………………………………………………………………………………………………………. 773

Представление последовательных элементов с помощью Span<T>………………………………….. 776

Вспомогательные методы……………………………………………………………………………………………. 781

Выражения коллекций и последовательности…………………………………………………………… 781

Сопоставление с образцом………………………………………………………………………………………….. 782

Только стек……………………………………………………………………………………………………………………. 783

Использование ref с полями……………………………………………………………………………………………………. 783

Представление последовательности элементов с помощью Memory<T>………………………….. 787

Тип ReadOnlySequence<T>…………………………………………………………………………………………………….. 788

Обработка потоков данных с помощью конвейеров……………………………………………………………. 788

Обработка JSON в ASP.NET Core……………………………………………………………………………………………. 791

Резюме………………………………………………………………………………………………………………………………………. 796

Предметный указатель…………………………………………………………………………. 797

Об авторе……………………………………………………………………………………………… 805

Об изображении на обложке………………………………………………………………… 806

Опубликовано

Новинка: “C++. 20 уроков для начинающих”

C++. 20 уроков для начинающих

Даны основы программирования на С++ по стандартам С++17 и С++20, базовые структуры данных и методы работы с ними. С позиций разработки ПО рассмотрено программирование функций: обычных и рекурсивных, constexpr-функций, лямбда-выраженй и лямбда-функций, перегрузка и шаблоны функций. Раскрыты более сложные вопросы С++: указатели и динамическая память, структуры и классы, конструкторы и деструкторы, методы и перегрузка операций, работа с текстовыми файлами, устройство чисел и битовые операции.

Рассмотрены важные для начинающих темы: интегрированная среда Code::Blocks, русификация ввода и вывода, ошибки при написании кода, неопределенное поведение, тестирование и написание тестового кода. В книге 150 примеров программ и более 90 заданий для самостоятельной работы. Материал проверен на практике при обучении студентов и школьников и подготовке их к экзаменам.

Электронное приложение-архив на сайте издательства содержит исходные коды всех примеров.

Для начинающих программистов

 

Лаптев Валерий Викторович

Лаптев Валерий Викторович, кандидат технических наук, профессиональный программист и преподаватель, работает с компьютерами с 1971 года, программирует на С++ с 1989 года, преподает в вузе с 1993 года. За это время разработал большое количество программ на многих языках программирования. В вузе читал разнообразные курсы по программированию на С++, алгоритмам и структурам данных, системному программированию и операционным системам. Обучил и воспитал сотни учеников. Написал ряд книг по С++ для студентов вузов и колледжей. Его статьи публиковались в журналах “Программист” и “RSDN Magazine”, на портале программистов rsdn.org.

Книгу “C++. 20 уроков для начинающих” можно купить в нашем интенет-магазине.

Предисловие. 11

Что вы найдете в книге. 12

Используемое ПО.. 13

Благодарности. 14

Как связаться с автором. 14

ЧАСТЬ I. Знакомство с C++. 15

Урок 1. Начало. 16

Процесс создания программы. 17

Программы-инструменты. 19

Редактор кода. 19

Компилятор и линкер. 19

Консоль или терминал. 20

Интегрированная среда. 22

Онлайн-компиляторы. 23

Задачи и упражнения. 24

Урок 2. Здравствуй, С++. 25

Первая программа. 25

Директива #include. 26

Using-директива. 26

Функция main. 27

Заголовок функции. 27

Тело функции. 28

Оператор вывода. 28

Оператор return. 29

Пишем комментарии. 29

Копнем глубже. 31

Формат кода. 31

Директивы. 32

Алфавит и зарезервированные слова. 32

Модифицируем первую программу. 33

Специальные символы. 34

Необрабатываемые строковые литералы. 35

Снова рефакторинг. 36

Русские буквы в консоли. 37

Вывод по-русски в системе Windows 38

Немного арифметики. 38

Задачи и упражнения. 40

Урок 3. Погружаемся в С++. 42

Ввод данных. 42

Работаем со строками. 45

Снова таблица умножения. 49

Вычисления. 50

Вещественные числа. 50

Как писать вещественные константы. 51

Тестируем программу. 52

Вывод данных. 55

Манипуляторы. 55

Снова вычисляем. 56

Задачи и упражнения. 58

Урок 4. Встроенные типы данных. 60

Арифметические типы данных. 60

Вещественные типы. 60

Целые типы. 63

Операции, выражения и присваивания. 65

Арифметические операции. 66

Присваивание. 67

Инкремент и декремент. 68

Преобразование типов. 69

Объявление переменных и констант. 71

Объявления auto. 73

Синонимы стандартных целых типов. 73

Объявление синонимов. 74

Порешаем задачи. 75

Задача 1. Математика должна быть экономной. 75

Задача 2. Стоимость учебников. 76

Задача 3. Число-палиндром. 77

Задачи и упражнения. 78

Урок 5. Выбор есть всегда. 80

Логический тип. 80

Логические операции и выражения. 81

Проверяем входные данные. 83

Условная операция. 83

Операция запятая. 84

Решаем задачу. 85

Условный оператор. 85

Решаем задачи. 88

Задача 1. Решить уравнение ax + b = 0. 88

Задача 2. Високосный год. 89

Булевские, целые и условия. 91

Ныряем глубже. 92

Задача 3. Кирпич и отверстие. 92

Никогда так не делайте. 93

Снова про ввод данных. 94

Задачи и упражнения. 96

Урок 6. Повторение — мать учения. 97

Повторяем работу. 97

Операторы цикла. 99

Оператор while. 99

Опять таблица умножения. 101

Оператор do while. 103

Оператор for со счетчиком. 104

Решаем задачи. 105

Полная таблица умножения. 105

Возведение в степень. 106

Вариации на тему циклов. 108

Операторная область видимости. 110

Операторы break и continue. 111

Задачи и упражнения. 112

Урок 7. Функции. 114

Объявление и вызов функции. 115

Как написать функцию.. 116

Определение функции. 118

Осваиваем функции. 119

Математические функции с числом p. 120

Функция-предикат. 123

Список параметров и вызов функции. 124

Передача параметров по значению.. 125

Передача параметров по ссылке. 126

Константные параметры функций. 127

Область видимости и время жизни. 128

Сокрытие имен. 129

Статические переменные. 131

Автоматизация тестирования функций. 133

Стандартные средства тестирования. 134

Задачи и упражнения. 135

Урок 8. С пользой для дела. 137

Тренажер по таблице умножения. 137

Случайные числа. 138

Инициализация датчика случайных чисел. 138

Получение случайных чисел. 142

Разработка программы. 143

Оператор-переключатель. 146

Система обучения арифметике. 148

Пишем калькулятор. 149

Пишем еще один тренажер. 150

Задачи и упражнения. 152

ЧАСТЬ II. Работа с данными в C++. 153

Урок 9. Массивы.. 154

Зачем нужны массивы. 154

Встроенные массивы. 156

Объявление массивов. 156

Синонимы типов для массивов. 158

Доступ к элементам. 158

Размер массива. 159

Операции с массивами. 159

Новые массивы. 161

Размер и тип массива. 161

Новый цикл for 162

Массив array. 163

Объявление и инициализация. 163

Операции с массивом array. 164

Объекты типа initalizer_list 165

Решаем задачи. 165

Поиск минимума. 166

Подсчет максимумов. 167

Поиск заданного числа. 168

Задачи и упражнения. 170

Урок 10. Создаем новые типы.. 171

Структуры (классы) 171

Зачем нужны структуры (классы) 171

Определение структуры (класса) 172

Объявление и инициализация объектов. 174

Операции с объектами структурного типа. 176

Размеры структур. 177

Структуры, массивы, объекты и функции. 178

Массивы и структуры. 179

Структуры, объекты и функции. 180

Классы и структуры. 182

Конструкторы. 184

Методы. 186

Задачи и упражнения. 187

Урок 11. Знакомство с указателями. 188

Что такое указатели. 188

Две самые важные операции. 190

Объявление указателей. 191

Типизированные указатели. 192

Бестиповые указатели и преобразование типов. 193

nullptr 194

Константность. 195

Размеры указателей. 195

Указатели и ссылки. 196

Встроенные массивы и указатели. 196

Операции с указателями. 197

Указатели, итераторы и контейнеры. 200

Функция distance. 203

Итераторы ввода/вывода. 204

Задачи и упражнения. 205

Урок 12. Массивы и функции. 206

Массивы и функции. 206

Передача массива по ссылке. 207

Перегрузка функций. 209

Про массив array. 211

Шаблоны функций. 213

Стандартные алгоритмы. 216

Заполнение массива. 216

Заполнение случайными числами. 218

Поиск, подсчет, замена. 219

Числовые алгоритмы. 220

Задачи и упражнения. 220

Урок 13. Строки, строки, строки. 222

Строки как массивы символов. 222

Итераторы для строки. 223

Стандартные средства. 224

Строка — массив переменного размера. 224

Встроенные символьные массивы. 225

Размер встроенного символьного массива. 226

Обработка символьных массивов. 227

Универсальный параметр string_view. 229

Размеры строк STL. 230

Числа — прописью.. 231

Тестирование программы. 234

Длинные-длинные числа. 235

Символы — это числа. 235

Функция сложения. 236

Задачи и упражнения. 237

Урок 14. Снова о функциях. 238

Рекурсивные функции. 238

Осваиваем рекурсию.. 241

Формы рекурсивных функций. 243

Выполнение рекурсивных функций. 244

Рекурсивные функции и массивы. 245

Функции времени компиляции. 250

Задачи и упражнения. 253

Урок 15. Печальная действительность. 254

Проблемы с целыми числами. 254

На ноль делить нельзя. 257

Вещественные числа тоже не подарок. 258

0.1 + 0.2 != 0.3. 259

«Страшный зверь» по имени UB. 261

Как не наступать на «грабли». 263

Исключения. 263

Генерация исключений. 263

Перехват и обработка исключений. 266

Стандартные исключения. 268

Обработка «плавающих граблей». 269

Функции isnan, isinf, isfinite. 270

Задачи и упражнения. 270

ЧАСТЬ III. Вглубь C++. 271

Урок 16. Как все устроено. 272

Числа, числа и числа. 272

Числа как многочлены. 274

Перевод из десятичной в другую систему. 275

Перевод в десятичную систему. 277

Стандартные средства. 278

Перевод дробных чисел. 279

Битовое устройство беззнаковых целых. 281

Битовые операции. 282

Как писать двоичные литералы. 283

Исключающее ИЛИ.. 284

Сдвиги. 285

Битовое устройство целых со знаком. 286

Сдвиг вправо знакового целого числа. 288

Дополнительный код. 288

Задачи и упражнения. 289

Урок 17. Опять функции. 290

Параметры по умолчанию.. 290

Функции как параметры. 291

Функциональные объекты. 293

Указатель на функцию.. 293

Лямбды. 294

Лямбда-функции. 296

Захват. 298

Перегрузка операций. 299

Задачи и упражнения. 300

Урок 18. Снова указатели. 301

Память и объекты. 301

Динамическая память для встроенных типов. 302

Динамическая память для реализованных типов. 303

Деструктор. 304

Динамические массивы. 305

Размеры массивов. 307

Стандартный динамический массив vector 309

Объявление и инициализация вектора. 309

Размеры векторов. 310

Операции с вектором. 311

Снова длинные числа. 312

Многомерные массивы. 313

Динамические многомерные массивы. 316

Задачи и упражнения. 317

Урок 19. Учимся писать и читать. 318

Потоки. 318

Стандартные потоки. 319

Ввод встроенных типов. 319

Ввод строк с пробелами. 321

Пишем новый калькулятор. 322

Строковые потоки. 323

Файлы. 325

Файлы и потоки. 326

Читаем и пишем. 326

ЕГЭ и файлы. 329

Задачи и упражнения. 331

Урок 20. Большие программы.. 332

Проект «Арифметика». 333

Разделение на модули. 333

Вывод инструкции. 335

Первая сборка. 336

Межмодульное взаимодействие. 336

Связывание. 337

Пространства имен. 339

Добавим тренажеры. 339

Препроцессор и модули. 344

Задачи и упражнения. 345

Подведение итогов. 346

Приложения. 347

Приложение 1. Список литературы.. 348

Приложение 2. Перечень ресурсов Интернета. 349

Приложение 3. Установка Code::Blocks 350

Загрузка установщика в Windows 350

Установка Code::Blocks в Windows 352

Установка Code::Blocks в «Альт Образование». 355

Установка Code::Blocks в МОС. 355

Приложение 4. Интегрированная среда Code::Blocks 356

Запуск IDE и выход. 356

Выключение ненужных панелей инструментов. 357

Создание и сохранение исходного кода. 358

Создание файла. 358

Создание проекта. 360

Установка режимов компиляции. 362

Компиляция и сборка. 363

Сообщения об ошибках. 363

Выполнение программы. 364

Предметный указатель. 365

Опубликовано

Вышло 2-е издание книги: “C# глазами хакера”

C# глазами хакера. 2-е изд.

Подробно рассмотрены  все аспекты безопасности от теории до реальных реализаций .NET-приложений на языке C#. Рассказано, как обеспечивать безопасную регистрацию, авторизацию и поддержку сессий пользователей. Перечислены уязвимости, которые могут быть присущи веб-сайтам и Web API, описано, как хакеры могут эксплуатировать уязвимости  и как можно обеспечить безопасность приложений. Даны основы оптимизации кода для обработки максимального количества пользователей с целью экономии ресурсов серверов и денег на хостинг. Рассмотрены сетевые функции: проверка соединения, отслеживание запроса, доступ к микросервисам, работа с сокетами и др. Приведены реальные примеры атак хакеров и способы защиты от них. Во втором издании добавлены новые примеры безопасности, рассмотрены вопросы реализации технологий OAuth2 и Single Sign On.

Для веб-программистов, администраторов и специалистов по безопасности

  • Теория безопасности кода
  • Проблемы авторизации
  • Безопасность веб-приложений на реальных примерах
  • Оптимизация кода
  • Защита Web API
  • Сетевые функции
  • Реальные примеры атак хакеров и защиты от них
  • Проблемы и реализация OAuth2 и Single Sign On

Книгу “C# глазами хакера. 2-е изд.“.

Предисловие…………………………………………………………………………………………….. 7

Об авторе………………………………………………………………………………………………………………………………………. 7

О книге…………………………………………………………………………………………………………………………………………… 8

Благодарности……………………………………………………………………………………………………………………………… 8

Глава 1. Теория безопасности………………………………………………………………… 10

1.1. Комплексная защита…………………………………………………………………………………………………………… 11

1.2. Сдвиг влево………………………………………………………………………………………………………………………….. 14

1.2.1. Обучение………………………………………………………………………………………………………………………… 15

1.2.2. Сбор требований…………………………………………………………………………………………………………… 16

1.2.3. Безопасность на этапе разработки……………………………………………………………………………… 16

1.2.4. Внешние компоненты……………………………………………………………………………………………………. 17

1.2.5. Статические анализаторы кода…………………………………………………………………………………… 17

1.2.6. Динамический анализатор кода………………………………………………………………………………….. 18

1.2.7. Испытание на проникновение……………………………………………………………………………………… 18

1.2.8. Отчеты……………………………………………………………………………………………………………………………. 18

1.3. Проект OWASP…………………………………………………………………………………………………………………….. 19

1.4. Отказ в обслуживании………………………………………………………………………………………………………… 20

1.5. Управление кодом………………………………………………………………………………………………………………. 22

1.6. Стабильность кода: нулевые исключения………………………………………………………………………… 24

1.7. Исключительные ситуации………………………………………………………………………………………………… 26

1.8. Журналы ошибок и аудит………………………………………………………………………………………………….. 27

1.9. Ошибки нужно исправлять…………………………………………………………………………………………………. 29

1.10. Отгружаем легко и часто………………………………………………………………………………………………….. 35

1.10.1. Обновление базы данных…………………………………………………………………………………………… 37

1.10.2. Копирование файлов………………………………………………………………………………………………….. 38

1.10.3. Распределенное окружение……………………………………………………………………………………….. 39

1.11. Шифрование трафика……………………………………………………………………………………………………….. 40

1.12. POST или GET?………………………………………………………………………………………………………………….. 42

1.13. Ограничение времени выполнения………………………………………………………………………………….. 45

1.14. Кто проверяет данные?…………………………………………………………………………………………………….. 46

Глава 2. Аутентификация и авторизация……………………………………………….. 47

2.1. Шаблон приложения…………………………………………………………………………………………………………… 47

2.2. Регистрация пользователей……………………………………………………………………………………………….. 50

2.3. Форма регистрации…………………………………………………………………………………………………………….. 51

2.3.1. Корректные данные регистрации………………………………………………………………………………… 53

2.3.2. Email с плюсом и точкой………………………………………………………………………………………………. 57

2.4. Хранение паролей………………………………………………………………………………………………………………. 58

2.4.1. Хеширование…………………………………………………………………………………………………………………. 59

2.4.2. MD5-хеширование………………………………………………………………………………………………………… 60

2.4.3. Безопасное хеширование……………………………………………………………………………………………… 64

2.4.4. И еще немного о безопасности…………………………………………………………………………………….. 64

2.5. Создание посетителей………………………………………………………………………………………………………… 65

2.6. Captcha………………………………………………………………………………………………………………………………… 66

2.6.1. Настраиваем Google reCAPTCHA……………………………………………………………………………….. 67

2.6.2. Пример использования reCAPTCHA……………………………………………………………………………. 69

2.6.3. Отменяем капчу…………………………………………………………………………………………………………….. 72

2.7. Аутентификация………………………………………………………………………………………………………………….. 73

2.7.1. Базовая аутентификация………………………………………………………………………………………………. 73

2.7.2. Журналирование и защита от перебора…………………………………………………………………….. 75

2.7.3. Защищаемся от перебора…………………………………………………………………………………………….. 76

2.8. Запомни меня………………………………………………………………………………………………………………………. 79

2.8.1. Зашифрованный якорь………………………………………………………………………………………………….. 80

2.8.2. Опасность HttpOnly………………………………………………………………………………………………………. 83

2.8.3. Уникальные токены………………………………………………………………………………………………………. 84

2.9. Автозаполнение…………………………………………………………………………………………………………………… 87

2.10. Авторизация………………………………………………………………………………………………………………………. 87

2.11. Железобетонная проверка……………………………………………………………………………………………….. 92

2.12. Протокол OAuth………………………………………………………………………………………………………………… 93

2.12.1. Конфигурирование приложения «Яндекс» OAuth……………………………………………………. 95

2.12.2. Создаем клиента…………………………………………………………………………………………………………. 99

2.12.3. Что дальше?………………………………………………………………………………………………………………. 103

2.13. Делим авторизацию………………………………………………………………………………………………………… 103

2.14. Защита сессии…………………………………………………………………………………………………………………. 104

2.15. Многоуровневая авторизация……………………………………………………………………………………….. 105

2.16. Microsoft Identity…………………………………………………………………………………………………………….. 107

Глава 3. Безопасность .NET-приложений……………………………………………… 111

3.1. Инъекция SQL: основы……………………………………………………………………………………………………… 111

3.1.1. SQL-уязвимость в ADO.NET……………………………………………………………………………………….. 112

3.1.2. Защита от SQL-инъекции……………………………………………………………………………………………. 115

3.2. Dapper ORM………………………………………………………………………………………………………………………. 118

3.3. Entity Framework……………………………………………………………………………………………………………….. 122

3.4. Отправка электронной почты………………………………………………………………………………………….. 126

3.4.1. Очереди сообщений……………………………………………………………………………………………………. 127

3.4.2. Работа с очередью………………………………………………………………………………………………………. 129

3.4.3. Отправляем письма…………………………………………………………………………………………………….. 131

3.5. Подделка параметров………………………………………………………………………………………………………. 133

3.6. Флуд…………………………………………………………………………………………………………………………………… 140

3.7. XSS: межсайтовый скриптинг………………………………………………………………………………………….. 142

3.7.1. Защита от XSS в .NET…………………………………………………………………………………………………. 143

3.7.2. Примеры эксплуатации XSS………………………………………………………………………………………. 146

3.7.3. Типы XSS……………………………………………………………………………………………………………………… 148

3.7.4. Хранимая XSS……………………………………………………………………………………………………………… 149

3.7.5. XSS: текст внутри тега………………………………………………………………………………………………… 155

3.7.6. Скрипты……………………………………………………………………………………………………………………….. 157

3.7.7. Атака через промежуточный слой…………………………………………………………………………….. 158

3.7.8. HTML-расширения……………………………………………………………………………………………………… 159

3.7.9. Вывод из контроллера………………………………………………………………………………………………… 160

3.7.10. Эксплуатация XSS-уязвимости………………………………………………………………………………… 161

3.8. Политика безопасности контента……………………………………………………………………………………. 161

3.8.1. CORS на страже контента………………………………………………………………………………………….. 162

3.8.2. Источники загрузки…………………………………………………………………………………………………….. 162

3.8.3. Тестирование политики……………………………………………………………………………………………… 165

3.8.4. Разрешенные источники…………………………………………………………………………………………….. 168

3.9. SQL Injection: доступ к недоступному……………………………………………………………………………. 170

3.10. CSRF: межсайтовая подделка запроса…………………………………………………………………………. 172

3.11. Загрузка файлов……………………………………………………………………………………………………………… 177

3.12. Переадресация………………………………………………………………………………………………………………… 179

3.13. Защита от DoS…………………………………………………………………………………………………………………. 183

3.14. Кликджекинг……………………………………………………………………………………………………………………. 186

Глава 4. О производительности в целом……………………………………………….. 191

4.1. Основы……………………………………………………………………………………………………………………………….. 191

4.2. Когда нужно оптимизировать?………………………………………………………………………………………… 193

4.3. Оптимизация и рефакторинг…………………………………………………………………………………………….. 194

4.4. Отображение данных……………………………………………………………………………………………………….. 195

4.5. Асинхронное выполнение запросов………………………………………………………………………………… 198

4.6. Параллельное выполнение………………………………………………………………………………………………. 199

4.7. LINQ…………………………………………………………………………………………………………………………………… 200

4.8. Обновление .NET………………………………………………………………………………………………………………. 202

Глава 5. Производительность в .NET……………………………………………………. 203

5.1. Типы данных……………………………………………………………………………………………………………………… 203

5.1.1. Производительность…………………………………………………………………………………………………… 203

5.1.2. Отличие структур от классов…………………………………………………………………………………….. 205

5.1.3. Ссылки на структуры…………………………………………………………………………………………………. 210

5.2. Виртуальные методы……………………………………………………………………………………………………….. 212

5.3. Управление памятью………………………………………………………………………………………………………… 214

5.4. Закрытие соединений с базой данных……………………………………………………………………………. 217

5.5. Циклы…………………………………………………………………………………………………………………………………. 220

5.6. Строки………………………………………………………………………………………………………………………………… 221

5.7. Исключительные ситуации………………………………………………………………………………………………. 223

5.8. Странный HttpClient…………………………………………………………………………………………………………. 224

5.9. Класс ArrayPool………………………………………………………………………………………………………………… 226

5.10. Параметризованные запросы к БД……………………………………………………………………………….. 228

Глава 6. Сеть………………………………………………………………………………………… 230

6.1. Проверка соединения……………………………………………………………………………………………………….. 230

6.2. Отслеживание запроса……………………………………………………………………………………………………… 231

6.3. Класс HTTP-клиент…………………………………………………………………………………………………………… 234

6.4. Класс Uri……………………………………………………………………………………………………………………………. 235

6.5. Уровень розетки………………………………………………………………………………………………………………… 237

6.5.1. Сервер………………………………………………………………………………………………………………………….. 237

6.5.2. Клиент………………………………………………………………………………………………………………………….. 241

6.6. Доменная система имен……………………………………………………………………………………………………. 243

Глава 7. Web API………………………………………………………………………………….. 245

7.1. Пример Web API………………………………………………………………………………………………………………… 245

7.2. JWT-токены……………………………………………………………………………………………………………………….. 246

7.3. Устройство токенов………………………………………………………………………………………………………….. 253

7.4. Авторизация API……………………………………………………………………………………………………………….. 256

7.5. XSS и Web API…………………………………………………………………………………………………………………… 257

Глава 8. Трюки…………………………………………………………………………………….. 260

8.1. Кеширование…………………………………………………………………………………………………………………….. 260

8.1.1. Кеширование результата…………………………………………………………………………………………… 260

8.1.2. Кеширование статичными переменными…………………………………………………………………. 264

8.1.3. Кеширование уровня запроса……………………………………………………………………………………. 265

8.1.4. Кеширование в памяти……………………………………………………………………………………………….. 266

8.1.5. Сервер кеширования…………………………………………………………………………………………………… 268

8.1.6. Cookie в качестве кеша……………………………………………………………………………………………….. 269

8.2. Сессии………………………………………………………………………………………………………………………………… 271

8.2.1. Пишем свою сессию……………………………………………………………………………………………………. 271

8.2.2. Безопасность сессии…………………………………………………………………………………………………… 274

8.2.3. Сессия в качестве кеша………………………………………………………………………………………………. 275

8.2.4. Уничтожение сессии…………………………………………………………………………………………………… 277

8.2.5. Выход…………………………………………………………………………………………………………………………… 277

8.2.6. Кукушка для сессии……………………………………………………………………………………………………. 278

8.2.7. Преимущества и недостатки………………………………………………………………………………………. 279

8.3. Защита от множественной обработки…………………………………………………………………………….. 280

Заключение………………………………………………………………………………………….. 284

Литература…………………………………………………………………………………………… 285

Приложение. Описание файлового архива, сопровождающего книгу….. 286

Предметный указатель…………………………………………………………………………. 287

 

Опубликовано

Вышла книга “Проектирование программ на C++”

Проектирование программ на C++

В книге заново разобраны и переосмыслены классические паттерны объектно-ориентированного проектирования на примере и с учётом всех возможностей современного языка C++. Указаны сильные стороны базовых паттернов проектирования, даны рекомендации по их сочетаемости, рассмотрены роли различных паттернов при инкапсуляции, обеспечении полиморфизма и в особенности наследования. Приведены примеры выразительного идиоматического языка C++, рассказано о работе с шаблонами стандартной библиотеки STL, затронуты сложные аспекты теории типов, интеграции больших приложений и работы с унаследованным кодом.

Для специалистов по C++ и архитекторов больших программных систем

Принципы и паттерны

С этой книгой Вы:

  • Научитесь оценивать свой код, сверяя его с проверенными паттернами проектирования
  • Разберитесь, что такое проектирование программ, какие цели ставятся при проектировании, в частности, что такое изменяемость и расширяемость программ
  • Исследуйте преимущества и недостатки каждого подхода к проектированию
  • Узнайте, как паттерны проектирования помогают решать поставленные задачи
  • Выбирайте именно тот паттерн проектирования, который наиболее уместен в конкретной ситуации

Книгу “Проектирование программ на C++” можно купить со скидкой в интернет-магазине издательства “БХВ“.

Отзывы о книге. 11

Об авторе. 13

Предисловие. 15

Почему я написал эту книгу. 15

О чем эта книга. 16

Проектирование программного обеспечения. 16

Современный C++. 16

Паттерны проектирования. 17

Для кого предназначена эта книга. 17

Как организована эта книга. 18

Условные обозначения и соглашения. 18

Использование примеров кода. 19

Благодарности. 19

ГЛАВА 1. Искусство проектирования программного обеспечения. 21

Руководство 1. О важности грамотного проектирования программного
обеспечения. 22

Почему возможности не являются частью проектирования
программного обеспечения. 22

Проектирование программного обеспечения: искусство управления зависимостями и абстракции  23

Три уровня проектирования программного обеспечения. 25

Акцент на возможностях. 29

Акцент на проектировании программного обеспечения и принципах проектирования  30

Руководство 2. Проектирование с учетом изменений. 31

Разделение ответственности. 31

Пример искусственного связывания. 32

Сравнение логической и физической связей. 35

Не повторяйся. 38

Избегайте преждевременного разделения ответственности. 42

Руководство 3. Разделение интерфейсов во избежание искусственной связи. 44

Разделяйте интерфейсы для разделения ответственности. 44

Минимизация требований к аргументам шаблона. 47

Руководство 4. Проектирование с учетом тестируемости. 48

Как протестировать приватную функцию-член. 48

Правильное решение: разделение ответственности. 52

Руководство 5. Проектирование для расширения. 55

Принцип открытости/закрытости. 56

Расширяемость времени компиляции. 60

Избегайте преждевременного проектирования для расширения. 62

ГЛАВА 2. Искусство создания абстракций. 65

Руководство 6. Как придерживаться ожидаемого поведения абстракций. 66

Пример нарушения ожиданий. 66

Принцип подстановки Барбары Лисков. 69

Критика принципа подстановки Барбары Лисков. 73

Потребность в хороших и осмысленных абстракциях. 74

Руководство 7. О сходстве между базовыми классами и понятиями. 74

Руководство 8. О семантических требованиях к перегрузочным наборам. 78

Сила свободных функций: механизм абстракции во время компиляции. 79

Проблема свободных функций: ожидания от поведения. 81

Руководство 9. Переключение внимания на владение абстракциями. 85

Принцип инверсии зависимостей. 85

Инверсия зависимостей в архитектуре подключаемых модулей. 90

Инверсия зависимостей с помощью шаблонов. 93

Инверсия зависимостей с помощью наборов перегрузки. 93

Принцип инверсии зависимостей против принципа единственной ответственности  95

Руководство 10. О возможности создания документа архитектуры. 96

ГЛАВА 3. Назначение паттернов проектирования. 101

Руководство 11. Цели паттернов проектирования. 101

Паттерн проектирования имеет название. 102

Паттерн проектирования несет в себе намерение. 103

Паттерн проектирования вводит абстракцию.. 104

Паттерн проектирования проверен. 106

Руководство 12. Предостережение насчет ошибочных представлений
о паттернах проектирования. 106

Паттерны проектирования не являются целью.. 107

Паттерны проектирования не связаны с деталями реализации. 108

Паттерны проектирования не ограничиваются объектно-ориентированным программированием или динамическим полиморфизмом. 111

Руководство 13. Вездесущие паттерны проектирования. 114

Руководство 14. Использование названия паттерна проектирования
для передачи намерений. 119

ГЛАВА 4. Паттерн проектирования Посетитель. 123

Руководство 15. Проектирование для добавления типов или операций. 123

Процедурное решение. 124

Объектно-ориентированное решение. 131

Помните о выборе проектирования в динамическом полиморфизме. 134

Руководство 16. Использование паттерна проектирования Посетитель для расширения операций  135

Анализ проблем проектирования. 136

Объяснение паттерна проектирования Посетитель. 137

Анализ недостатков паттерна проектирования Посетитель. 141

Руководство 17. Шаблонный класс std::variant для реализации Посетителя. 145

Введение в std::variant 145

Рефакторинг рисования фигур как ненавязчивое решение,
основанное на значении. 148

Тесты производительности. 154

Анализ недостатков решения std::variant 155

Руководство 18. О производительности паттерна проектирования
Ациклический посетитель. 157

ГЛАВА 5. Паттерны проектирования Стратегия и Команда. 163

Руководство 19. Использование паттерна проектирования Стратегия
для изоляции способов выполнения задач. 163

Анализ проблем проектирования. 166

Объяснение паттерна проектирования Стратегия. 170

Анализ недостатков прямолинейного решения. 174

Сравнение паттернов проектирования Посетитель и Стратегия. 181

Анализ недостатков паттерна проектирования Стратегия. 181

Проектирование на основе политик. 184

Руководство 20. Предпочтение композиции наследованию.. 187

Руководство 21. Использование паттерна проектирования Команда для идентификации выполняемого действия  190

Объяснение паттерна проектирования Команда. 190

Сравнение паттернов проектирования Команда и Стратегия. 198

Анализ недостатков паттерна проектирования Команда. 201

Руководство 22. Предпочтение семантики значений семантике ссылок. 202

Недостатки стиля “Банды четырех”: семантика ссылок. 202

Семантика ссылок: второй пример. 206

Современная философия C++: семантика значений. 208

Семантика значений: второй пример. 210

Предпочтение семантики значений для реализации паттернов
проектирования. 212

Руководство 23. Предпочтение основанной на значениях реализации
паттернов Стратегия и Команда. 213

Введение в std::function. 213

Рефакторинг рисования геометрических фигур. 215

Тесты производительности. 220

Анализ недостатков решения std::function. 222

ГЛАВА 6. Паттерны проектирования Адаптер, Наблюдатель и CRTP. 223

Руководство 24. Использование паттерна проектирования Адаптер для стандартизации интерфейсов  223

Объяснение паттерна проектирования Адаптер. 225

Адаптеры объектов и адаптеры классов. 227

Примеры из стандартной библиотеки. 228

Сравнение паттернов проектирования Адаптер и Стратегия. 230

Функциональные адаптеры. 230

Анализ недостатков паттерна проектирования Адаптер. 232

Руководство 25. Применение паттерна проектирования Наблюдатель
в качестве абстрактного механизма уведомления. 236

Объяснение паттерна проектирования Наблюдатель. 236

Классическая реализация Наблюдателя. 237

Реализация Наблюдателя на основе семантики значений. 248

Анализ недостатков паттерна проектирования Наблюдатель. 250

Руководство 26. Использование паттерна проектирования CRTP
для введения категорий статических типов. 252

Мотивация для CRTP. 253

Объяснение паттерна проектирования CRTP. 258

Анализ недостатков паттерна проектирования CRTP. 264

Будущее CRTP: сравнение концепций CRTP и C++20. 266

Руководство 27. Использование паттерна проектирования CRTP
для статических классов-примесей. 269

Мотивация сильных типов. 269

Использование CRTP в качестве паттерна реализации. 272

ГЛАВА 7. Паттерны проектирования Мост, Прототип и Внешний полиморфизм.. 277

Руководство 28. Создание Мостов для устранения физических зависимостей. 277

Мотивирующий пример. 278

Объяснение паттерна проектирования Мост. 283

Идиома pimpl 286

Сравнение паттернов проектирования Мост и Стратегия. 291

Анализ недостатков паттерна проектирования Мост. 294

Руководство 29. Выигрыши и потери в производительности
при использовании паттерна проектирования Мост. 295

Влияние Мостов на производительность. 295

Повышение производительности с помощью частичных Мостов. 298

Руководство 30. Применение паттерна проектирования Прототип
для операций абстрактного копирования. 301

Пример с овцами: копирование животных. 302

Объяснение паттерна проектирования Прототип. 304

Сравнение Прототипа и std::variant 307

Анализ недостатков паттерна проектирования Прототип. 308

Руководство 31. Использование паттерна проектирования Внешний полиморфизм для неинтрузивного полиморфизма времени выполнения. 309

Объяснение паттерна проектирования Внешний полиморфизм. 310

Возвращение к рисованию фигур. 313

Сравнение паттернов проектирования Внешний полиморфизм и Адаптер. 322

Анализ недостатков паттерна проектирования Внешней полиморфизм. 322

ГЛАВА 8. Паттерн проектирования Затирание типов. 327

Руководство 32. Возможность замены иерархий наследования паттерном проектирования Затирание типов  327

История Затирания типов. 328

Объяснение паттерна проектирования Затирание типов. 330

Реализация Затирания типов с владением. 333

Анализ недостатков паттерна проектирования Затирание типов. 341

Сравнение двух оберток паттерна проектирования Затирание типов. 342

Разделение интерфейсов оберток Затирания типов. 345

Тесты производительности. 346

Несколько слов о терминологии. 347

Руководство 33. Об оптимизирующем потенциале паттерна проектирования Затирание типов  349

Оптимизация малого буфера. 349

Реализация диспетчеризации функций вручную.. 359

Руководство 34. О затратах на установку оберток для Затирания типов
с владением. 365

Затраты на установку обертки Затирания типов с владением. 365

Простая реализация Затирания типов без владения. 368

Более мощная реализация Затирания типов без владения. 370

ГЛАВА 9. Паттерн проектирования Декоратор. 381

Руководство 35. Использование паттерна проектирования Декоратор для иерархического добавления настроек  381

Проектировочная проблема ваших коллег. 382

Объяснение паттерна проектирования Декоратор. 386

Классическая реализация паттерна проектирования Декоратор. 389

Второй пример использования паттерна проектирования Декоратор. 394

Сравнение паттернов проектирования Декоратор, Адаптер и Стратегия. 397

Анализ недостатков паттерна проектирования Декоратор. 398

Руководство 36. Компромисс между абстракциями времени выполнения
и времени компиляции. 401

Декоратор времени компиляции, основанный на значениях. 401

Декоратор времени выполнения, основанный на значениях. 407

ГЛАВА 10. Паттерн Одиночка. 415

Руководство 37. Одиночка как паттерн реализации, а не как паттерн проектирования. 415

Объяснение паттерна Одиночка. 416

Одиночка не управляет зависимостями и не уменьшает их. 419

Руководство 38. Проектирование Одиночек с учетом изменений
и тестируемости. 421

Одиночки представляют глобальное состояние. 421

Одиночки затрудняют изменяемость и тестируемость. 423

Инвертирование зависимостей на Одиночке. 427

Применение паттерна проектирования Стратегия. 432

Переход к внедрению локальных зависимостей. 437

ГЛАВА 11. Последнее руководство. 441

Руководство 39. Продолжайте изучать паттерны проектирования. 441

Предметный указатель. 445

 

Клаус Игльбергер

Игльбергер Клаус – разработчик-фрилансер и консультант, специализирующийся на C++. Автор популярных видеокурсов, в которых делится своим более чем пятнадцатилетним опытом, объездил весь мир, выступая на конференциях по С++. Получив степень PhD в 2010 году, занимается проектированием крупномасштабных программных систем.

Опубликовано

Новинка: “C# 11 и .NET 7.0”

C# 11 и .NET 7.0

Книга о разработке нативных, кросc-платформенных и веб-приложений на платформе .NET с использованием языка C#. Подробно рассмотрена экосистема платформы .NET, средства связи в распределённых системах (gRPC и SignalR), инструменты современной веб-разработки – Blazor, библиотека машинного обучения ML.NET, фреймворк для веб-разработки ASP.NET Core, инструментарий Entity Framework Core 7. Объяснены возможности подготовки микросервисной архитектуры, а также развёртывание контейнеров и управление ими с применением Docker Swarm и Kubernetes.

Для разработчиков

Создаём кросс-платформенные приложения на базе .NET Core

Платформа .NET – это развитая среда, в которой можно разрабатывать и выполнять приложения любых типов. Хотя официально на платформе .NET поддерживается несколько языков программирования, наиболее популярен среди них именно язык C#, и его можно считать флагманским.

В этой книге разобраны основы .NET, пошагово объяснено, как создавать нативные приложения, которые легко адаптировать для работы на многих платформах. Уделено внимание взаимодействию с базами данных и работе с Entity Framework Core 7. Рассматривается ASP.NET Core, главный фреймворк .NET, предназначенный для веб-разработки.

Обсуждаются и более современные веб-технологии, в частности Blazor (технология на основе WebAssembly, специально предназначенная для платформы .NET), а также настройка двунаправленной коммуникации с использованием SignalR и gRPC. В последней части книги описано развёртывание и контейнеризация приложения с применением Docker Swarm и Kubernetes.

Прочитав книгу, вы научитесь уверенно создавать  приложения на языке C# для платформы .NET.

В этой книге

    • Знакомство с новейшими возможностями языка C#
    • Работа с новыми возможностями .NET 7, в том числе, SDK и библиотеками
    • Создание веб-приложений с применением ASP.NET Core 7
    • Подготовка моделей машинного обучения с использованием ML.NET
    • Приёмы, позволяющие быстро и безопасно собирать и развёртывать распределённые приложения

Для кого эта книга
Книга рассчитана на широкую аудиторию разработчиков: для тех, кто хочет изучить язык C# и платформу .NET в их современной редакции, для желающих освоить веб-разработку на платформе .NET и для тех, кому требуется разрабатывать нативные и кросс-платформенные приложения с применением C# и .NET.

Книгу “C# 11 и .NET 7.0” можно купить со скидкой в интернет-магазине издательства “БХВ“.

Об авторе……………………………………………………………………………………………….. 15

О рецензентах………………………………………………………………………………………… 16

Благодарности……………………………………………………………………………………….. 17

Предисловие…………………………………………………………………………………………… 18

Комплект исходного кода и цветные иллюстрации……………………………………………………………….. 22

Глава 1. Знакомство со структурой приложений .NET 7………………………… 23

Введение……………………………………………………………………………………………………………………………………… 23

Структура…………………………………………………………………………………………………………………………………… 24

Цели…………………………………………………………………………………………………………………………………………….. 24

Настройка среды разработки…………………………………………………………………………………………………… 24

Компьютеры, подходящие для разработки ПО……………………………………………………………….. 24

.NET 7 SDK………………………………………………………………………………………………………………………….. 24

Установка редактора кода или среды IDE………………………………………………………………………. 25

Установка подходящего редактора кода……………………………………………………………….. 26

Установка подходящей IDE…………………………………………………………………………………….. 28

Microsoft Visual Studio 2022………………………………………………………………………………………………. 28

Microsoft Visual Studio 2022 for Mac……………………………………………………………………….. 29

JetBrains Rider……………………………………………………………………………………………………………………… 30

Создание приложения .NET 7…………………………………………………………………………………………………… 31

Создание приложения с помощью CLI…………………………………………………………………………….. 32

Создание приложения с помощью графического интерфейса IDE……………………………….. 33

Обзор структуры проекта .NET 7……………………………………………………………………………………………… 35

Добавление объекта struct………………………………………………………………………………………………… 35

Добавление интерфейса и класса…………………………………………………………………………………….. 36

Изменение точки входа в приложение……………………………………………………………………………… 39

Основы C# 11 и встроенные типы данных………………………………………………………………………………. 41

Встроенные типы данных…………………………………………………………………………………………………. 41

Поток управления………………………………………………………………………………………………………………. 43

Пользовательские типы в C#…………………………………………………………………………………………….. 44

Модификаторы доступа……………………………………………………………………………………………………. 44

Заключение………………………………………………………………………………………………………………………………… 45

Что следует помнить………………………………………………………………………………………………………………….. 46

Контрольные вопросы………………………………………………………………………………………………………………. 46

Ответы…………………………………………………………………………………………………………………………………. 47

Основные термины…………………………………………………………………………………………………………………….. 47

Глава 2. Обзор возможностей C# 11……………………………………………………….. 48

Введение……………………………………………………………………………………………………………………………………… 48

Структура…………………………………………………………………………………………………………………………………… 48

Цели…………………………………………………………………………………………………………………………………………….. 48

Предварительные условия………………………………………………………………………………………………………… 49

Автоматическая инициализация структур………………………………………………………………………………. 49

Обобщенные атрибуты……………………………………………………………………………………………………………… 50

Пример обобщенного атрибута………………………………………………………………………………………… 51

Сопоставление последовательности с образцом……………………………………………………………………. 53

Демонстрация сопоставления последовательности с образцом…………………………………… 54

Сопоставление последовательности с образцом типа char span………………………………….. 54

Новые операции со строками…………………………………………………………………………………………………… 56

Заключение………………………………………………………………………………………………………………………………… 59

Что следует помнить………………………………………………………………………………………………………………….. 60

Контрольные вопросы………………………………………………………………………………………………………………. 60

Ответы…………………………………………………………………………………………………………………………………. 61

Основные термины…………………………………………………………………………………………………………………….. 61

Глава 3. Что нового в .NET 7?………………………………………………………………… 62

Введение……………………………………………………………………………………………………………………………………… 62

Структура…………………………………………………………………………………………………………………………………… 62

Цели…………………………………………………………………………………………………………………………………………….. 62

Предварительные условия………………………………………………………………………………………………………… 63

Улучшения в SDK и инструментах сборки………………………………………………………………………………. 63

Улучшения инструментов командной строки…………………………………………………………………. 63

NativeAOT и функция обрезки библиотек………………………………………………………………………… 64

Центральный диспетчер пакетов……………………………………………………………………………………… 65

Обновления библиотек System и Microsoft……………………………………………………………………………… 66

Поддержка микросекунд и наносекунд……………………………………………………………………………. 66

Новые возможности для работы с JSON………………………………………………………………………….. 68

Свойство MaxDepth класса JsonWriterOptions………………………………………………………. 69

Конфигурация JsonSerializerOptions по умолчанию…………………………………………….. 70

Вызовы HTTP PATCH для JSON……………………………………………………………………………….. 70

Полиморфизм JSON…………………………………………………………………………………………………… 71

Тестирование возможностей JSON………………………………………………………………………….. 73

Новые возможности класса Stream…………………………………………………………………………………… 73

Улучшения RegEx………………………………………………………………………………………………………………. 75

Улучшения в криптографии………………………………………………………………………………………………. 76

Новый TAR API………………………………………………………………………………………………………………….. 78

Улучшения наблюдаемости……………………………………………………………………………………………………… 80

Новые способы мониторинга действий……………………………………………………………………………. 80

Мониторинг остановленных действий……………………………………………………………………. 80

Событие изменения текущего действия………………………………………………………………….. 81

Перечисление свойств действия………………………………………………………………………………. 81

Показатель UpDownCounter……………………………………………………………………………………………… 83

Критические изменения в .NET 7………………………………………………………………………………………………. 83

Допустимость неопределенных значений в пространстве имен Microsoft.Extensions… 83

Конечные точки: устаревшие и не допускающие неопределенных значений……………… 84

Ограничение PatternContext……………………………………………………………………………………………… 84

Многоуровневый поиск в Windows отключен…………………………………………………………………. 84

Сериализация пользовательских типов в MSBuild…………………………………………………………. 84

Заключение………………………………………………………………………………………………………………………………… 85

Что следует помнить………………………………………………………………………………………………………………….. 85

Контрольные вопросы………………………………………………………………………………………………………………. 86

Ответы…………………………………………………………………………………………………………………………………. 86

Основные термины…………………………………………………………………………………………………………………….. 87

Глава 4. MAUI и кросс-платформенные нативные приложения…………….. 88

Введение……………………………………………………………………………………………………………………………………… 88

Структура…………………………………………………………………………………………………………………………………… 88

Цели…………………………………………………………………………………………………………………………………………….. 89

Предварительные условия………………………………………………………………………………………………………… 89

Общие сведения о MAUI……………………………………………………………………………………………………………. 89

Включение среды разработки MAUI……………………………………………………………………………….. 90

Создание простых MAUI-приложений…………………………………………………………………………….. 91

Справочные данные по MAUI XAML…………………………………………………………………….. 94

Работа с Blazor на платформе .NET MAUI………………………………………………………………………. 97

Архитектурные паттерны MAUI………………………………………………………………………………………. 99

Model-View-ViewModel……………………………………………………………………………………………… 99

Паттерны, поддерживаемые MAUI через сторонние платформы……………………………….. 101

ReactiveUI………………………………………………………………………………………………………………… 101

Model-View-Update………………………………………………………………………………………………….. 101

Использование MAUI для создания настольных приложений……………………………………………. 102

Подготовка среды разработки настольных приложений…………………………………………….. 102

Запуск настольного приложения в режиме отладки…………………………………………………….. 102

Публикация настольного приложения…………………………………………………………………………… 103

Использование MAUI для создания мобильных приложений…………………………………………….. 104

Подготовка среды разработки мобильных приложений……………………………………………… 105

Запуск мобильного приложения на эмуляторе……………………………………………………………… 106

Публикация мобильного приложения……………………………………………………………………………. 106

Ограничения разработки для Mac OS и iOS………………………………………………………………………….. 107

Дополнительные инструменты, необходимые для публикации приложений
для iOS……………………………………………………………………………………………………………………………….. 107

Менее строгие требования к приложениям для Mac OS………………………………………………. 108

Заключение………………………………………………………………………………………………………………………………. 108

Что следует помнить……………………………………………………………………………………………………………….. 109

Контрольные вопросы…………………………………………………………………………………………………………….. 109

Ответы……………………………………………………………………………………………………………………………….. 110

Основные термины…………………………………………………………………………………………………………………… 110

Глава 5. Доступ к базам данных с помощью Entity Framework 7………….. 111

Введение…………………………………………………………………………………………………………………………………… 111

Структура…………………………………………………………………………………………………………………………………. 111

Цели…………………………………………………………………………………………………………………………………………… 112

Предварительные условия………………………………………………………………………………………………………. 112

Знакомство с основами реляционных БД……………………………………………………………………………… 112

Обзор систем управления реляционными БД и SQL…………………………………………………….. 112

Таблицы, отношения и нормализация……………………………………………………………………………. 113

Введение первичных ключей…………………………………………………………………………………. 115

Нормализация и отношения внешних ключей……………………………………………………… 115

Введение в Entity Framework 7……………………………………………………………………………………………….. 117

Подход “сначала код” в EF7…………………………………………………………………………………………………… 119

Добавление кода Entity Framework………………………………………………………………………………… 119

Добавление объектов-сущностей…………………………………………………………………………………… 120

Добавление контекста базы данных………………………………………………………………………………. 122

Добавление скрипта создания базы данных…………………………………………………………………. 124

Создание базы данных путем запуска приложения……………………………………………………… 128

Подход “сначала база данных” в EF7……………………………………………………………………………………. 129

Создание моделей EF7 из существующей БД……………………………………………………………….. 129

Просмотр автоматически сгенерированного кода……………………………………………………….. 130

Новейшие функции EF7…………………………………………………………………………………………………………… 131

Подход “сначала база данных” и управление с помощью шаблонов T4…………………… 131

Защищенный ключ…………………………………………………………………………………………………………… 131

Отображение “одна таблица на конкретный тип” (TPC)……………………………………………… 133

Перехватчики……………………………………………………………………………………………………………………. 136

Заключение………………………………………………………………………………………………………………………………. 137

Что следует помнить……………………………………………………………………………………………………………….. 137

Контрольные вопросы…………………………………………………………………………………………………………….. 138

Ответы……………………………………………………………………………………………………………………………….. 139

Основные термины…………………………………………………………………………………………………………………… 139

Глава 6. Типы веб-приложений в .NET………………………………………………… 140

Введение…………………………………………………………………………………………………………………………………… 140

Структура…………………………………………………………………………………………………………………………………. 140

Цели…………………………………………………………………………………………………………………………………………… 141

Предварительные условия………………………………………………………………………………………………………. 141

Основы ASP.NET Core……………………………………………………………………………………………………………… 141

Структура базового приложения ASP.NET Core…………………………………………………………… 141

Web API в ASP.NET Core…………………………………………………………………………………………………………. 144

Web API с контроллерами……………………………………………………………………………………………….. 144

Конечные точки Minimal API………………………………………………………………………………………….. 149

Добавление метаданных Open API……………………………………………………………………….. 150

Улучшение передачи параметров в Minimal API………………………………………………… 150

Minimal API и типизированные результаты…………………………………………………………. 151

Выгрузка файлов в Minimal API…………………………………………………………………………….. 153

Новое в промежуточном ПО для обработки запросов…………………………………………………. 153

MVC в ASP.NET Core……………………………………………………………………………………………………………….. 155

Razor Pages в ASP.NET Core……………………………………………………………………………………………………. 167

Заключение………………………………………………………………………………………………………………………………. 169

Что следует помнить……………………………………………………………………………………………………………….. 170

Контрольные вопросы…………………………………………………………………………………………………………….. 170

Ответы……………………………………………………………………………………………………………………………….. 171

Основные термины…………………………………………………………………………………………………………………… 171

Глава 7. Blazor и WebAssembly в .NET………………………………………………….. 172

Введение…………………………………………………………………………………………………………………………………… 172

Структура…………………………………………………………………………………………………………………………………. 173

Цели…………………………………………………………………………………………………………………………………………… 173

Предварительные условия………………………………………………………………………………………………………. 173

Общие сведения о Blazor…………………………………………………………………………………………………………. 173

Примеры Razor-компонентов………………………………………………………………………………………….. 174

@page……………………………………………………………………………………………………………………….. 175

@onclick…………………………………………………………………………………………………………………… 175

@code……………………………………………………………………………………………………………………….. 175

Ключевые слова Razor в Razor-компонентах……………………………………………………………….. 175

@using………………………………………………………………………………………………………………………. 176

@implements……………………………………………………………………………………………………………. 176

@inherits…………………………………………………………………………………………………………………… 176

@inject……………………………………………………………………………………………………………………… 176

@layout…………………………………………………………………………………………………………………….. 176

@namespace…………………………………………………………………………………………………………….. 176

@preservewhitespace……………………………………………………………………………………………….. 177

@attributes……………………………………………………………………………………………………………….. 177

@bind……………………………………………………………………………………………………………………….. 177

@ref………………………………………………………………………………………………………………………….. 177

@typeparam…………………………………………………………………………………………………………….. 178

Обзор Blazor WebAssembly……………………………………………………………………………………………………… 178

Отделение кода программной части………………………………………………………………………………. 179

Взаимодействие с JavaScript…………………………………………………………………………………………… 181

Передача параметров в Razor-компоненты…………………………………………………………………… 182

Предварительная компиляция………………………………………………………………………………………… 183

Пустой шаблон Blazor WebAssembly……………………………………………………………………………… 184

Хостинг приложений Blazor WebAssembly в ASP.NET Core………………………………………………… 185

Добавление хостируемого приложения Blazor WebAssembly к существующему приложению ASP.NET Core       185

Проверка форм в Blazor…………………………………………………………………………………………………… 186

NavigationManager и передача состояния между страницами……………………………………. 188

Настройка Blazor Server………………………………………………………………………………………………………….. 189

Пользовательские элементы в Blazor……………………………………………………………………………… 190

Жизненный цикл Razor-компонента………………………………………………………………………………. 191

Пустой шаблон Blazor Server………………………………………………………………………………………….. 192

Заключение………………………………………………………………………………………………………………………………. 193

Что следует помнить……………………………………………………………………………………………………………….. 193

Контрольные вопросы…………………………………………………………………………………………………………….. 194

Ответы……………………………………………………………………………………………………………………………….. 194

Основные термины…………………………………………………………………………………………………………………… 195

Глава 8. SignalR и двусторонняя связь………………………………………………….. 196

Введение…………………………………………………………………………………………………………………………………… 196

Структура…………………………………………………………………………………………………………………………………. 197

Цели…………………………………………………………………………………………………………………………………………… 197

Предварительные условия………………………………………………………………………………………………………. 197

Общие сведения о библиотеке SignalR…………………………………………………………………………………… 197

WebSocket…………………………………………………………………………………………………………………………. 198

Server-Sent Events……………………………………………………………………………………………………………… 198

Длительный опрос……………………………………………………………………………………………………………. 199

Создание хаба SignalR на сервере…………………………………………………………………………………………. 199

Строго типизированный хаб…………………………………………………………………………………………… 202

Внедрение зависимостей в хаб SignalR………………………………………………………………………….. 203

JSON и MessagePack…………………………………………………………………………………………………………. 204

JavaScript-клиент для SignalR…………………………………………………………………………………………………. 204

Добавление HTML-разметки для клиента SignalR……………………………………………………….. 205

Применение функций SignalR в JavaScript……………………………………………………………………… 208

.NET-клиент для SignalR………………………………………………………………………………………………………….. 211

Заключение………………………………………………………………………………………………………………………………. 214

Что следует помнить……………………………………………………………………………………………………………….. 214

Контрольные вопросы…………………………………………………………………………………………………………….. 214

Ответы……………………………………………………………………………………………………………………………….. 215

Основные термины…………………………………………………………………………………………………………………… 215

Глава 9. gRPC в ASP.NET Core…………………………………………………………….. 216

Введение…………………………………………………………………………………………………………………………………… 216

Структура…………………………………………………………………………………………………………………………………. 216

Цели…………………………………………………………………………………………………………………………………………… 217

Предварительные условия………………………………………………………………………………………………………. 217

Общие сведения о технологии gRPC………………………………………………………………………………. 217

Protobuf как основной протокол сериализации сообщений………………………………………………… 218

Настройка сервера gRPC………………………………………………………………………………………………………… 218

Структура проекта ASP.NET Core gRPC………………………………………………………………………… 219

Типы вызовов и типы данных gRPC……………………………………………………………………………….. 221

JSON-перекодирование в gRPC……………………………………………………………………………………….. 224

Настройка клиента gRPC………………………………………………………………………………………………………… 227

Использование фабрики клиентов gRPC и внедрение зависимостей…………………………… 230

Обзор типов данных gRPC………………………………………………………………………………………………………. 232

Перечисления Protobuf…………………………………………………………………………………………………….. 233

Использование коллекций с помощью ключевого слова repeated………………………………. 234

Функциональность словаря в Protobuf…………………………………………………………………………… 234

Использование ключевого слова oneof в Protobuf………………………………………………………… 234

Общеизвестные типы данных…………………………………………………………………………………………………. 235

Заключение………………………………………………………………………………………………………………………………. 236

Что следует помнить……………………………………………………………………………………………………………….. 237

Контрольные вопросы…………………………………………………………………………………………………………….. 237

Ответы……………………………………………………………………………………………………………………………….. 238

Основные термины…………………………………………………………………………………………………………………… 238

Глава 10. Машинное обучение с помощью ML.NET…………………………….. 239

Введение…………………………………………………………………………………………………………………………………… 239

Структура…………………………………………………………………………………………………………………………………. 240

Цели…………………………………………………………………………………………………………………………………………… 240

Предварительные условия………………………………………………………………………………………………………. 240

Основы ML.NET……………………………………………………………………………………………………………………….. 240

Типы машинного обучения……………………………………………………………………………………………… 242

Обучение с учителем………………………………………………………………………………………………. 242

Обучение без учителя…………………………………………………………………………………………….. 242

Обучение с подкреплением……………………………………………………………………………………. 242

Начало работы с ML.NET………………………………………………………………………………………………. 243

Установка инструментов ML.NET………………………………………………………………………… 243

Использование ML.NET для создания первой модели МО…………………………………. 244

Выбор задачи для МО…………………………………………………………………………………………………………….. 246

Бинарная классификация………………………………………………………………………………………………… 246

Многоклассовая классификация…………………………………………………………………………………….. 248

Регрессия…………………………………………………………………………………………………………………………… 249

Рекомендации…………………………………………………………………………………………………………………… 250

Прогнозирование……………………………………………………………………………………………………………… 251

Классификация изображений…………………………………………………………………………………………. 253

Кластеризация………………………………………………………………………………………………………………….. 254

Обнаружение отклонений……………………………………………………………………………………………….. 254

Ранжирование…………………………………………………………………………………………………………………… 255

Обучение и оценка модели……………………………………………………………………………………………………… 255

Показатели бинарной классификации…………………………………………………………………………… 256

Показатели многоклассовой классификации………………………………………………………………… 256

Классификация изображений…………………………………………………………………………………………. 256

Прогнозирование……………………………………………………………………………………………………………… 257

Регрессия и рекомендации………………………………………………………………………………………………. 257

Показатели кластеризации……………………………………………………………………………………………… 257

Показатели обнаружения отклонений…………………………………………………………………………… 258

Показатели ранжирования……………………………………………………………………………………………… 258

Использование малокодового построителя моделей…………………………………………………………… 258

Заключение………………………………………………………………………………………………………………………………. 261

Что следует помнить……………………………………………………………………………………………………………….. 262

Контрольные вопросы…………………………………………………………………………………………………………….. 262

Ответы……………………………………………………………………………………………………………………………….. 263

Основные термины…………………………………………………………………………………………………………………… 263

Глава 11. Микросервисы и контейнеризация в .NET 7…………………………. 265

Введение…………………………………………………………………………………………………………………………………… 265

Структура…………………………………………………………………………………………………………………………………. 266

Цели…………………………………………………………………………………………………………………………………………… 266

Предварительные условия………………………………………………………………………………………………………. 266

Контейнеры Docker………………………………………………………………………………………………………………….. 266

Контейнеры и образы контейнеров………………………………………………………………………………… 267

Базовые образы и уровни………………………………………………………………………………………………… 267

Изоляция сети и сопоставление портов…………………………………………………………………………. 268

Изоляция файловой системы и монтирование каталогов хоста………………………………….. 268

Установка Docker в Linux………………………………………………………………………………………………… 269

Установка Docker на Mac……………………………………………………………………………………………….. 269

Установка Docker в Windows…………………………………………………………………………………………… 269

Базовый образ Docker для .NET 7…………………………………………………………………………………………… 270

Создание приложения с поддержкой Docker…………………………………………………………………. 271

Добавление поддержки Docker в существующее приложение…………………………………….. 272

Структура файла Dockerfile……………………………………………………………………………………………. 273

Создание и запуск контейнера Docker…………………………………………………………………………… 275

Оркестрация приложений с помощью Docker Swarm…………………………………………………………… 275

Базовая оркестрация помощью Docker Compose………………………………………………………….. 276

Запуск Docker Swarm……………………………………………………………………………………………………….. 278

Оркестрация приложений с помощью Kubernetes………………………………………………………………… 279

Установка Kubernetes в Linux…………………………………………………………………………………………. 279

Установка Kubernetes на Mac…………………………………………………………………………………………. 280

Добавление сервисов в кластер Kubernetes…………………………………………………………………… 281

Заключение………………………………………………………………………………………………………………………………. 282

Что следует помнить……………………………………………………………………………………………………………….. 282

Контрольные вопросы…………………………………………………………………………………………………………….. 282

Ответы……………………………………………………………………………………………………………………………….. 283

Основные термины…………………………………………………………………………………………………………………… 283

Предметный указатель…………………………………………………………………………. 285

Федор Сазанцев

Сазанавец Фёдор (Sazanavets Fiodar) — профессиональный инженер-программист, который широко использует программное обеспечение компании Microsoft. Основные области его специализации включают ASP.NET (Framework и Core), SQL Server, Azure, Docker, Интернет вещей (IoT), архитектуру микросервисов и различные интерфейсные технологии. Фёдор имеет большой практический опыт разработки программного обеспечения в различных отраслях, включая гидротехнику, финансы, розничную торговлю, железную дорогу и оборону. С энтузиазмом обучает других людей навыкам программирования. Автор ряда книг и курсов по программированию.

Опубликовано

Долгожданная “Библия C#. 6-е издание”

Библия C#. 6-е издание

Книга посвящена программированию на языке C#  для платформы Microsoft .NET, начиная с основ языка и разработки программ для работы в режиме командной строки и заканчивая созданием современных веб-приложений. Материал сопровождается большим количеством практических примеров. Подробно описывается логика выполнения каждого участка программы. Уделено внимание вопросам повторного использования кода. В 6-м издании примеры переписаны с учетом современной платформы .NET 7, большой упор сделан на веб–приложения и фреймворк доступа к данным  Entity Framework. На сайте издательства находятся коды программ, дополнительная справочная информация и копия базы данных для выполнения примеров из книги.

Для программистов

Программирование может быть доступно каждому!

Книга будет полезна всем, кто хочет научиться писать программы для платформы Microsoft .NET на современном и удобном языке программирования C#. Большое количество практических примеров, легкость изложения материала и интересные комментарии призваны сделать обучение занимательным и нескучным, а подробное описание логики выполнения каждого участка кода поможет читателю использовать полученные знания при разработке собственных приложений.
Дополнительным источником знаний в процессе дальнейшего обучения служит электронный архив к книге, содержащий коды программ, дополнительную справочную информацию и копию базы данных для выполнения примеров из книги.

  • Программирование для .NET на C#
  • Платформа .NET
  • Базы данных
  • Веб-программирование
  • Сетевое программирование
  • Повторное использование кода
  • Изучение языка на полезных примерах

…Невозможно научить программировать с помощью одной книги, но я попытаюсь заинтересовать вас этим великолепным миром. На сайте издательства выложено множество дополнительных материалов, которые пригодятся вам в самостоятельном изучении. Книга дает основную и необходимую информацию, чтобы вы сразу после ее прочтения смогли приступить к написанию своих собственных приложений …
Михаил Фленов

Книгу “Библия C#. 6-е издание” можно купить со скидкой в интернет-магазине издательства “БХВ“.

Предисловие…………………………………………………………………………………………….. 9

Благодарности……………………………………………………………………………………….. 13

Бонус……………………………………………………………………………………………………… 15

Структура книги……………………………………………………………………………………. 17

Глава 1. Введение в .NET……………………………………………………………………….. 19

1.1. Платформа .NET………………………………………………………………………………………………………………….. 19

1.1.1. «Кубики» .NET…………………………………………………………………………………………………………… 20

1.1.2. Сборки……………………………………………………………………………………………………………………….. 21

1.2. Обзор среды разработки Visual Studio .NET…………………………………………………………………….. 23

1.2.1. Работа с проектами и решениями……………………………………………………………………………. 23

1.2.2. Работа с файлами……………………………………………………………………………………………………… 31

1.3. Простейший пример .NET-приложения…………………………………………………………………………….. 31

1.3.1. Проект на языке C#…………………………………………………………………………………………………… 31

1.3.2. Компиляция и запуск проекта на языке C#…………………………………………………………….. 32

1.4. Компиляция приложений……………………………………………………………………………………………………. 34

1.4.1. Компиляция в .NET Framework………………………………………………………………………………… 34

1.4.2. Компиляция в .NET Core или .NET 5 и старше……………………………………………………….. 35

1.5. Поставка сборок………………………………………………………………………………………………………………….. 37

1.6. Формат исполняемого файла .NET……………………………………………………………………………………. 40

1.7. Код верхнего уровня…………………………………………………………………………………………………………… 41

Глава 2. Основы C#……………………………………………………………………………….. 42

2.1. Комментарии……………………………………………………………………………………………………………………….. 42

2.2. Переменная………………………………………………………………………………………………………………………….. 43

2.3. Именование элементов кода………………………………………………………………………………………………. 46

2.4. Работа с переменными……………………………………………………………………………………………………….. 49

2.4.1. Строки и символы…………………………………………………………………………………………………….. 52

2.4.2. Массивы…………………………………………………………………………………………………………………….. 55

2.4.3. Перечисления……………………………………………………………………………………………………………. 58

2.5. Простейшая математика…………………………………………………………………………………………………….. 61

2.6. Условные операторы………………………………………………………………………………………………………….. 66

2.6.1. Условный оператор if………………………………………………………………………………………………. 66

2.6.2. Условный оператор switch………………………………………………………………………………………. 69

2.6.3. Сокращенная проверка……………………………………………………………………………………………. 70

2.7. Циклы…………………………………………………………………………………………………………………………………… 71

2.7.1. Цикл for……………………………………………………………………………………………………………………… 71

2.7.2. Цикл while………………………………………………………………………………………………………………….. 74

2.7.3. Цикл do…while…………………………………………………………………………………………………………… 75

2.7.4. Цикл foreach………………………………………………………………………………………………………………. 76

2.8. Управление циклом…………………………………………………………………………………………………………….. 77

2.8.1. Оператор break…………………………………………………………………………………………………………. 77

2.8.2. Оператор continue…………………………………………………………………………………………………….. 78

2.9. Константы……………………………………………………………………………………………………………………………. 79

2.10. Нулевые значения…………………………………………………………………………………………………………….. 80

2.11. Начальные значения переменных…………………………………………………………………………………… 80

2.12. Системы счисления…………………………………………………………………………………………………………… 81

2.13. Логические операции……………………………………………………………………………………………………….. 84

Глава 3. Объектно-ориентированное программирование………………………. 86

3.1. Объекты на C#…………………………………………………………………………………………………………………….. 86

3.2. Свойства………………………………………………………………………………………………………………………………. 90

3.3. Методы………………………………………………………………………………………………………………………………… 96

3.3.1. Описание методов…………………………………………………………………………………………………….. 97

3.3.2. Параметры методов………………………………………………………………………………………………….. 99

3.3.3. Перегрузка методов………………………………………………………………………………………………… 107

3.3.4. Конструктор……………………………………………………………………………………………………………. 107

3.3.5. Статичность……………………………………………………………………………………………………………. 112

3.3.6. Рекурсия…………………………………………………………………………………………………………………… 115

3.3.7. Деструктор………………………………………………………………………………………………………………. 118

3.3.8. Упрощенный синтаксис…………………………………………………………………………………………. 119

3.4. Метод Main()……………………………………………………………………………………………………………………… 120

3.5. Оператор Using…………………………………………………………………………………………………………………. 122

3.6. Объекты только для чтения……………………………………………………………………………………………… 123

3.7. Объектно-ориентированное программирование……………………………………………………………. 124

3.7.1. Наследование…………………………………………………………………………………………………………. 124

3.7.2. Инкапсуляция………………………………………………………………………………………………………….. 128

3.7.3. Полиморфизм………………………………………………………………………………………………………….. 131

3.8. Наследование от класса Object……………………………………………………………………………………….. 133

3.9. Переопределение методов……………………………………………………………………………………………….. 134

3.10. Обращение к предку из класса………………………………………………………………………………………. 138

3.11. Вложенные классы…………………………………………………………………………………………………………. 140

3.12. Область видимости…………………………………………………………………………………………………………. 142

3.13. Ссылочные и простые типы данных…………………………………………………………………………….. 144

3.14. Проверка класса объекта……………………………………………………………………………………………….. 145

3.15. Неявный тип данных var………………………………………………………………………………………………… 146

3.16. Абстрактные классы………………………………………………………………………………………………………. 147

3.17. Инициализация свойств………………………………………………………………………………………………….. 150

3.18. Частицы класса……………………………………………………………………………………………………………….. 151

Глава 4. Консольные приложения………………………………………………………… 152

4.1. Украшение консоли………………………………………………………………………………………………………….. 153

4.2. Работа с буфером консоли……………………………………………………………………………………………….. 155

4.3. Окно консоли…………………………………………………………………………………………………………………….. 157

4.4. Запись в консоль……………………………………………………………………………………………………………….. 157

4.5. Чтение данных из консоли……………………………………………………………………………………………….. 160

Глава 5. Продвинутое программирование……………………………………………. 162

5.1. Приведение и преобразование типов………………………………………………………………………………. 162

5.2. Все в .NET — это объекты………………………………………………………………………………………………… 164

5.3. Работа с перечислениями Enum………………………………………………………………………………………. 166

5.3.1. Перечисления — это значения………………………………………………………………………………. 166

5.3.2. Перечисления-флаги………………………………………………………………………………………………. 169

5.4. Структуры…………………………………………………………………………………………………………………………. 172

5.5. Дата и время………………………………………………………………………………………………………………………. 177

5.6. Класс строк……………………………………………………………………………………………………………………….. 180

5.7. Перегрузка операторов…………………………………………………………………………………………………….. 183

5.7.1. Математические операторы………………………………………………………………………………….. 184

5.7.2. Операторы сравнения…………………………………………………………………………………………….. 186

5.7.3. Операторы преобразования………………………………………………………………………………….. 187

5.8. Шаблоны……………………………………………………………………………………………………………………………. 189

5.9. Анонимные типы……………………………………………………………………………………………………………….. 192

5.10. Кортежи…………………………………………………………………………………………………………………………… 194

5.11. Форматирование строк…………………………………………………………………………………………………… 195

5.12. Динамика…………………………………………………………………………………………………………………………. 196

Глава 6. Интерфейсы……………………………………………………………………………. 198

6.1. Объявление интерфейсов………………………………………………………………………………………………….. 199

6.2. Реализация интерфейсов………………………………………………………………………………………………….. 201

6.3. Использование реализации интерфейса…………………………………………………………………………. 202

6.4. Интерфейсы в качестве параметров………………………………………………………………………………… 205

6.5. Перегрузка интерфейсных методов…………………………………………………………………………………. 206

6.6. Наследование……………………………………………………………………………………………………………………. 208

6.7. Клонирование объектов…………………………………………………………………………………………………… 209

6.8. Реализация по умолчанию……………………………………………………………………………………………….. 210

Глава 7. Массивы, списки, коллекции и словари…………………………………. 213

7.1. Базовый класс для массивов……………………………………………………………………………………………. 213

7.2. Невыровненные массивы…………………………………………………………………………………………………. 215

7.3. Динамические массивы…………………………………………………………………………………………………….. 217

7.4. Индексаторы массива………………………………………………………………………………………………………. 220

7.5. Интерфейсы массивов………………………………………………………………………………………………………. 221

7.5.1. Интерфейс IEnumerable………………………………………………………………………………………….. 222

7.5.2. Интерфейсы IComparer и IComparable…………………………………………………………………. 225

7.6. Оператор yield…………………………………………………………………………………………………………………… 228

7.7. Стандартные списки…………………………………………………………………………………………………………. 229

7.7.1. Класс Queue…………………………………………………………………………………………………………….. 229

7.7.2. Класс Stack……………………………………………………………………………………………………………… 230

7.7.3. Класс Hashtable………………………………………………………………………………………………………. 231

7.8. Типизированные массивы………………………………………………………………………………………………… 233

7.9. Словарь……………………………………………………………………………………………………………………………… 236

Глава 8. Обработка исключительных ситуаций…………………………………… 238

8.1. Исключительные ситуации………………………………………………………………………………………………. 239

8.2. Исключения в C#……………………………………………………………………………………………………………….. 241

8.3. Оформление блоков try…………………………………………………………………………………………………….. 244

8.4. Ошибки в визуальных приложениях……………………………………………………………………………….. 245

8.5. Генерирование исключительных ситуаций……………………………………………………………………. 247

8.6. Иерархия классов исключений………………………………………………………………………………………… 248

8.7. Собственный класс исключения……………………………………………………………………………………… 249

8.8. Блок finally………………………………………………………………………………………………………………………… 252

8.9. Переполнение……………………………………………………………………………………………………………………. 253

8.10. Замечание о производительности…………………………………………………………………………………. 256

Глава 9. События…………………………………………………………………………………. 257

9.1. Делегаты……………………………………………………………………………………………………………………………. 257

9.2. События и их вызов…………………………………………………………………………………………………………… 258

9.3. Использование собственных делегатов………………………………………………………………………….. 261

9.4. Делегаты изнутри……………………………………………………………………………………………………………… 265

9.5. Анонимные методы…………………………………………………………………………………………………………… 267

Глава 10. LINQ…………………………………………………………………………………….. 268

10.1. LINQ при работе с массивами……………………………………………………………………………………….. 268

10.1.1. SQL-стиль использования LINQ………………………………………………………………………… 268

10.1.2. Использование LINQ через методы………………………………………………………………….. 271

10.2. Магия IEnumerable………………………………………………………………………………………………………….. 271

10.3. Доступ к данным…………………………………………………………………………………………………………….. 275

10.4. Использование LINQ для доступа к XML…………………………………………………………………….. 276

Глава 11. Хранение информации………………………………………………………….. 279

11.1. Файловая система…………………………………………………………………………………………………………… 279

11.2. Текстовые файлы…………………………………………………………………………………………………………….. 282

11.3. Бинарные файлы…………………………………………………………………………………………………………….. 285

11.4. XML-файлы……………………………………………………………………………………………………………………… 289

11.4.1. Создание XML-документов……………………………………………………………………………….. 289

11.4.2. Чтение XML-документов……………………………………………………………………………………. 293

11.5. Потоки Stream………………………………………………………………………………………………………………….. 296

11.6. Потоки MemoryStream…………………………………………………………………………………………………….. 297

11.7. Сериализация………………………………………………………………………………………………………………….. 299

11.7.1. Отключение сериализации………………………………………………………………………………… 302

11.7.2. Сериализация в XML…………………………………………………………………………………………. 304

11.7.3. Особенности сериализации……………………………………………………………………………….. 305

11.7.4. Управление сериализацией……………………………………………………………………………….. 307

Глава 12. Многопоточность………………………………………………………………….. 310

12.1. Класс Thread……………………………………………………………………………………………………………………. 311

12.2. Передача параметра в поток…………………………………………………………………………………………. 314

12.3. Конкурентный доступ…………………………………………………………………………………………………….. 316

12.4. Пул потоков…………………………………………………………………………………………………………………….. 318

12.5. Домены приложений .NET……………………………………………………………………………………………… 320

12.6. Ключевые слова async и await………………………………………………………………………………………. 323

12.7. Задачи или потоки — что выбрать?……………………………………………………………………………… 330

Глава 13. Добро пожаловать в веб-программирование…………………………. 332

13.1. Создание первого веб-приложения……………………………………………………………………………….. 332

13.2. Работа с конфигурацией сайта……………………………………………………………………………………… 339

13.3. Работа со статичными файлами……………………………………………………………………………………. 342

13.4. Модель – Представление – Контроллер………………………………………………………………………. 343

13.5. Маршрутизация………………………………………………………………………………………………………………. 345

13.6. Подробнее про контроллеры…………………………………………………………………………………………. 352

13.7. Представления………………………………………………………………………………………………………………… 355

13.8. Модель представления…………………………………………………………………………………………………… 359

13.9. Представления Razor……………………………………………………………………………………………………… 362

13.9.1. Комментарии………………………………………………………………………………………………………. 362

13.9.2. Вывод данных в представлениях……………………………………………………………………… 363

13.9.3. C#-код………………………………………………………………………………………………………………….. 364

13.9.4. Условные операторы…………………………………………………………………………………………. 365

13.9.5. Циклы…………………………………………………………………………………………………………………… 367

13.9.6. Исключительные ситуации……………………………………………………………………………….. 370

13.9.7. Ключевое слово using………………………………………………………………………………………… 370

13.10. Создание представлений……………………………………………………………………………………………… 372

13.10.1. Макеты………………………………………………………………………………………………………………. 372

13.10.2. Стартовый файл……………………………………………………………………………………………….. 376

13.10.3. Встраиваемые представления…………………………………………………………………………. 378

13.10.4. Компоненты………………………………………………………………………………………………………. 382

13.10.5. Секции……………………………………………………………………………………………………………….. 385

13.11. Работа с формами…………………………………………………………………………………………………………. 386

13.12. Проверка данных………………………………………………………………………………………………………….. 391

13.13. Работа с сессиями…………………………………………………………………………………………………………. 395

13.14. Cookie…………………………………………………………………………………………………………………………….. 397

13.15. Доступ к запросу…………………………………………………………………………………………………………… 399

Глава 14. Базы данных………………………………………………………………………… 401

14.1. Библиотека ADO.NET…………………………………………………………………………………………………….. 401

14.2. Строка подключения………………………………………………………………………………………………………. 403

14.3. Подключение к базе данных………………………………………………………………………………………….. 405

14.4. Инъекция зависимостей на примере подключений……………………………………………………… 408

14.5. Пул соединений………………………………………………………………………………………………………………. 412

14.6. Чтение данных из БД………………………………………………………………………………………………………. 413

14.7. Запросы с параметрами…………………………………………………………………………………………………. 417

14.8. Редактирование данных…………………………………………………………………………………………………. 420

14.9. Транзакции………………………………………………………………………………………………………………………. 421

14.10. Библиотека Dapper……………………………………………………………………………………………………….. 422

Глава 15. Entity Framework Core………………………………………………………….. 425

15.1. Создаем EF-приложение………………………………………………………………………………………………… 426

15.2. Код первичен…………………………………………………………………………………………………………………… 427

15.3. Контекст базы данных……………………………………………………………………………………………………. 429

15.4. Доступ к базе данных…………………………………………………………………………………………………….. 431

15.5. Миграции…………………………………………………………………………………………………………………………. 433

15.6. База данных первична……………………………………………………………………………………………………. 439

15.7. LINQ…………………………………………………………………………………………………………………………………. 441

15.8. Связи: один ко многим……………………………………………………………………………………………………. 442

15.9. Работа со связями……………………………………………………………………………………………………………. 444

15.10. Связи: многие ко многим………………………………………………………………………………………………. 446

15.11. Связи: один к одному……………………………………………………………………………………………………. 451

15.12. Журналы……………………………………………………………………………………………………………………….. 453

15.13. Как сохраняются данные?…………………………………………………………………………………………… 456

15.14. Погружение в запросы………………………………………………………………………………………………….. 459

15.15. Асинхронный доступ……………………………………………………………………………………………………. 468

15.16. Поиск по шаблону………………………………………………………………………………………………………… 469

15.17. Удаление данных………………………………………………………………………………………………………….. 470

15.18. Отслеживание изменений…………………………………………………………………………………………….. 471

15.19. Погружение в связи……………………………………………………………………………………………………….. 475

Глава 16. Повторное использование кода…………………………………………….. 481

16.1. Библиотеки………………………………………………………………………………………………………………………. 481

16.2. Создание библиотеки……………………………………………………………………………………………………… 482

16.3. Приватные сборки…………………………………………………………………………………………………………… 488

Глава 17. Сетевые сервисы…………………………………………………………………… 490

17.1. История……………………………………………………………………………………………………………………………. 490

17.2. Создаем WebAPI……………………………………………………………………………………………………………… 492

17.3. Теория Web API………………………………………………………………………………………………………………. 496

17.4. Сессии………………………………………………………………………………………………………………………………. 498

17.5. Полный цикл……………………………………………………………………………………………………………………. 500

Заключение………………………………………………………………………………………….. 503

Список литературы………………………………………………………………………………. 505

Приложение. Описание электронного архива, сопровождающего книгу 507

Предметный указатель…………………………………………………………………………. 509

 

Фленов Михаил

Флёнов Михаил, профессиональный программист. Работал в журнале «Хакер», в котором несколько лет вел рубрики «Hack-FAQ» и «Кодинг» для программистов, печатался в журналах «Игромания» и «Chip-Россия». Автор бестселлеров «Библия Delphi», «Программирование в Delphi глазами хакера», «Программирование на C++ глазами хакера», «Компьютер глазами хакера» и др. Некоторые книги переведены на иностранные языки и изданы в США, Канаде, Польше и других странах.

Опубликовано

Новинка: “C# глазами хакера”

C# глазами хакера

Подробно рассмотрены  все аспекты безопасности от теории до реальных реализаций .NET-приложений на языке C#. Рассказано, как обеспечивать безопасную регистрацию, авторизацию и поддержку сессий пользователей. Перечислены уязвимости, которые могут быть присущи веб-сайтам и Web API, описано, как хакеры могут эксплуатировать уязвимости  и как можно обеспечить безопасность приложений. Даны основы оптимизации кода для обработки максимального количества пользователей с целью экономии ресурсов серверов и денег на хостинг. Рассмотрены сетевые функции: проверка соединения, отслеживание запроса, доступ к микросервисам, работа с сокетами и др. Приведены реальные примеры атак хакеров и способы защиты от них.

Для веб-программистов, администраторов и специалистов по безопасности

В течение 8 лет я работал над сайтами Sony с высокой нагрузкой и высокими требованиями по безопасности. За все это время сайты ни разу не были взломаны. Есть мнение, что безопасность – это сложно. Отчасти это верно. Но и сложное – возможно!
В этой книге я решил поделиться своим опытом работы над сайтами e-commerce с высокой нагрузкой, рассмотреть все аспекты безопасности от теории до реальных реализаций .NET-приложений на языке C# и рассказать, как обеспечить безопасность, оптимизировать код и обрабатывать высокие нагрузки с минимальными ресурсами.
Михаил Фленов, автор книги

Книгу “C# глазами хакера” можно купить со скидкой в интернет-магазине издательства “БХВ“.

Предисловие…………………………………………………………………………………………….. 7

Об авторе………………………………………………………………………………………………………………………………………. 7

О книге…………………………………………………………………………………………………………………………………………… 8

Благодарности……………………………………………………………………………………………………………………………… 8

Глава 1. Теория безопасности………………………………………………………………… 11

1.1. Комплексная защита…………………………………………………………………………………………………………… 12

1.2. Отказ в обслуживании………………………………………………………………………………………………………… 15

1.3. Управление кодом………………………………………………………………………………………………………………. 17

1.4. Стабильность кода: нулевые исключения………………………………………………………………………… 19

1.5. Исключительные ситуации………………………………………………………………………………………………… 21

1.6. Журналы ошибок и аудит………………………………………………………………………………………………….. 22

1.7. Ошибки нужно исправлять…………………………………………………………………………………………………. 24

1.8. Отгружаем легко и часто……………………………………………………………………………………………………. 28

1.8.1. Обновление базы данных…………………………………………………………………………………………….. 30

1.8.2. Копирование файлов…………………………………………………………………………………………………….. 31

1.8.3. Распределенное окружение………………………………………………………………………………………….. 32

1.9. Шифрование трафика…………………………………………………………………………………………………………. 33

1.10. POST или GET?………………………………………………………………………………………………………………….. 35

Глава 2. Безопасность .NET-приложений……………………………………………….. 39

2.1. Шаблон приложения…………………………………………………………………………………………………………… 39

2.2. Регистрация пользователей……………………………………………………………………………………………….. 41

2.3. Форма регистрации…………………………………………………………………………………………………………….. 43

2.3.1. Корректные данные регистрации………………………………………………………………………………… 44

2.3.2. Email с плюсом и точкой………………………………………………………………………………………………. 48

2.4. Хранение паролей………………………………………………………………………………………………………………. 49

2.4.1. Хеширование…………………………………………………………………………………………………………………. 51

2.4.2. MD5-хеширование………………………………………………………………………………………………………… 51

2.4.3. Безопасное хеширование……………………………………………………………………………………………… 54

2.5. Создание посетителей………………………………………………………………………………………………………… 55

2.6. Captcha………………………………………………………………………………………………………………………………… 56

2.6.1. Настраиваем Google reCAPTCHA……………………………………………………………………………….. 57

2.6.2. Пример использования reCAPTCHA……………………………………………………………………………. 59

2.6.3. Отменяем капчу…………………………………………………………………………………………………………….. 62

2.7. Авторизация………………………………………………………………………………………………………………………… 63

2.7.1. Базовая авторизация…………………………………………………………………………………………………….. 63

2.7.2. Журналирование и защита от перебора…………………………………………………………………….. 65

2.7.3. Защищаемся от перебора…………………………………………………………………………………………….. 66

2.8. Инъекция SQL: основы……………………………………………………………………………………………………….. 69

2.8.1. SQL-уязвимость в ADO.NET…………………………………………………………………………………………. 69

2.8.2. Защита от SQL-инъекции……………………………………………………………………………………………… 73

2.9. Dapper ORM…………………………………………………………………………………………………………………………. 75

2.10. Entity Framework……………………………………………………………………………………………………………….. 80

2.11. Отправка электронной почты………………………………………………………………………………………….. 84

2.11.1. Очереди сообщений……………………………………………………………………………………………………. 85

2.11.2. Работа с очередью………………………………………………………………………………………………………. 87

2.11.3. Отправляем письма…………………………………………………………………………………………………….. 88

2.12. Многоуровневая авторизация…………………………………………………………………………………………. 90

2.13. Запомни меня…………………………………………………………………………………………………………………….. 91

2.13.1. Зашифрованный якорь……………………………………………………………………………………………….. 92

2.13.2. Опасность HttpOnly…………………………………………………………………………………………………….. 95

2.13.3. Что дальше?…………………………………………………………………………………………………………………. 97

2.14. Подделка параметров………………………………………………………………………………………………………. 97

2.15. Флуд…………………………………………………………………………………………………………………………………. 100

2.16. XSS: межсайтовый скриптинг………………………………………………………………………………………… 102

2.16.1. Защита от XSS в .NET……………………………………………………………………………………………….. 103

2.16.2. Примеры эксплуатации XSS…………………………………………………………………………………….. 106

2.16.3. Типы XSS……………………………………………………………………………………………………………………. 108

2.16.4. Хранимая XSS……………………………………………………………………………………………………………. 109

2.16.5. XSS: текст внутри тега……………………………………………………………………………………………… 115

2.16.6. Скрипты……………………………………………………………………………………………………………………… 116

2.17. SQL Injection: доступ к недоступному………………………………………………………………………….. 117

2.18. CSRF: межсайтовая подделка запроса…………………………………………………………………………. 119

2.19. Загрузка файлов……………………………………………………………………………………………………………… 123

2.20. Контроль доступа…………………………………………………………………………………………………………… 125

2.21. Переадресация………………………………………………………………………………………………………………… 128

2.22. Защита от DoS…………………………………………………………………………………………………………………. 130

Глава 3. Основы производительности………………………………………………….. 135

3.1. Основы……………………………………………………………………………………………………………………………….. 135

3.2. Когда нужно оптимизировать?………………………………………………………………………………………… 137

3.3. Оптимизация и рефакторинг…………………………………………………………………………………………….. 138

3.4. Отображение данных……………………………………………………………………………………………………….. 139

3.5. Асинхронное выполнение запросов………………………………………………………………………………… 142

3.6. Параллельное выполнение………………………………………………………………………………………………. 143

3.7. LINQ…………………………………………………………………………………………………………………………………… 144

3.8. Обновление .NET………………………………………………………………………………………………………………. 146

Глава 4. Производительность в .NET……………………………………………………. 147

4.1. Типы данных……………………………………………………………………………………………………………………… 147

4.1.1. Производительность…………………………………………………………………………………………………… 147

4.1.2. Отличие структур от классов…………………………………………………………………………………….. 149

4.1.3. Ссылки на структуры…………………………………………………………………………………………………. 154

4.2. Виртуальные методы……………………………………………………………………………………………………….. 156

4.3. Управление памятью………………………………………………………………………………………………………… 158

4.4. Закрытие соединений с базой данных……………………………………………………………………………. 161

4.5. Циклы…………………………………………………………………………………………………………………………………. 164

4.6. Строки………………………………………………………………………………………………………………………………… 165

4.7. Исключительные ситуации………………………………………………………………………………………………. 167

4.8. Странный HttpClient…………………………………………………………………………………………………………. 168

Глава 5. Сеть………………………………………………………………………………………… 171

5.1. Проверка соединения……………………………………………………………………………………………………….. 171

5.2. Отслеживание запроса……………………………………………………………………………………………………… 172

5.3. Класс HTTP-клиент…………………………………………………………………………………………………………… 175

5.4. Класс Uri……………………………………………………………………………………………………………………………. 176

5.5. Уровень розетки………………………………………………………………………………………………………………… 178

5.5.1. Сервер………………………………………………………………………………………………………………………….. 178

5.5.2. Клиент………………………………………………………………………………………………………………………….. 182

5.6. Доменная система имен……………………………………………………………………………………………………. 184

Глава 6. Web API………………………………………………………………………………….. 187

6.1. Пример Web API………………………………………………………………………………………………………………… 187

6.2. JWT-токены……………………………………………………………………………………………………………………….. 188

6.3. Устройство токенов………………………………………………………………………………………………………….. 195

Глава 7. Трюки…………………………………………………………………………………….. 199

7.1. Кеширование…………………………………………………………………………………………………………………….. 199

7.1.1. Защита от XSS в .NET…………………………………………………………………………………………………. 199

7.1.2. Кеширование статичными переменными…………………………………………………………………. 203

7.1.3. Кеширование уровня запроса……………………………………………………………………………………. 204

7.1.4. Кеширование в памяти……………………………………………………………………………………………….. 205

7.1.5. Сервер кеширования…………………………………………………………………………………………………… 207

7.1.6. Cookie в качестве кеша……………………………………………………………………………………………….. 208

7.2. Сессии………………………………………………………………………………………………………………………………… 210

7.2.1. Пишем свою сессию……………………………………………………………………………………………………. 210

7.2.2. Безопасность сессии…………………………………………………………………………………………………… 212

7.3. Защита от множественной обработки…………………………………………………………………………….. 213

Заключение………………………………………………………………………………………….. 217

Литература…………………………………………………………………………………………… 219

Приложение. Описание файлового архива, сопровождающего книгу….. 221

Предметный указатель…………………………………………………………………………. 222

Фленов Михаил

Флёнов Михаил, профессиональный программист. Работал в журнале «Хакер», в котором несколько лет вел рубрики «Hack-FAQ» и «Кодинг» для программистов, печатался в журналах «Игромания» и «Chip-Россия». Автор бестселлеров «Библия Delphi», «Программирование в Delphi глазами хакера», «Программирование на C++ глазами хакера», «Компьютер глазами хакера» и др. Некоторые книги переведены на иностранные языки и изданы в США, Канаде, Польше и других странах.