
Это новое издание фундаментальной книги Иэна Гриффитса по языку 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

