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

Новинка: “Современный 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

Добавить комментарий