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

Новинка: “Современный 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++ глазами хакера», «Компьютер глазами хакера» и др. Некоторые книги переведены на иностранные языки и изданы в США, Канаде, Польше и других странах.