Выбрать главу

Часть IV. Дополнительные конструкции программирования на C#

В этой части книги вы углубите знания языка C# за счет исследования нескольких более сложных (и важных) концепций. Здесь вы завершите ознакомление с системой типов .NET Core, изучив коллекции и обобщения. Вы также освоите несколько более сложных средств C# (такие как методы расширения, перегрузка операций, анонимные типы и манипулирование указателями). Затем вы узнаете о делегатах и лямбда-выражениях, взглянете на язык LINQ, а в конце части ознакомитесь с процессами и многопоточным/асинхронным программированием.

Глава 10. Коллекции и обобщения

В этой главе исследуется тема обобщений. Вы увидите, что программирование с обобщениями предлагает способ создания типов и членов типов, которые содержат заполнители, указываемые вызывающим кодом. По существу обобщения значительно улучшают производительность приложений и безопасность в отношении типов. Здесь не только описаны разнообразные обобщенные типы из пространства имен System.Collections.Generic, но также показано, каким образом строить собственные обобщенные методы и типы (с ограничениями и без).

Глава 11. Расширенные средства языка C#

В этой главе вы сможете углубить понимание языка C# за счет исследования нескольких расширенных приемов программирования. Здесь вы узнаете, как перегружать операции и создавать специальные процедуры преобразования (явного и неявного) для типов. Вы также научитесь строить и взаимодействовать с индексаторами типов и работать с расширяющими методами, анонимными типами, частичными методами и указателями С#, используя контекст небезопасного кода.

Глава 12. Делегаты, события и лямбда-выражения

Целью этой главы является прояснение типа делегата. Выражаясь просто, делегат .NET Core представляет собой объект, который указывает на определенные методы в приложении. С помощью делегатов можно создавать системы, которые позволяют многочисленным объектам участвовать в двухстороннем взаимодействии. После исследования способов применения делегатов .NET Core вы ознакомитесь с ключевым словом event языка С#, которое упрощает манипулирование низкоуровневыми делегатами в коде. В завершение вы узнаете о роли лямбда-операции C# (=>), а также о связи между делегатами, анонимными методами и лямбда-выражениями.

Глава 13. LINQ to Objects

В этой главе начинается исследование языка интегрированных запросов (LINQ). Язык LINQ дает возможность строить строго типизированные выражения запросов, которые могут применяться к многочисленным целевым объектам LINQ для манипулирования данными в самом широком смысле этого слова. Здесь вы изучите API-интерфейс LINQ to Objects, который позволяет применять выражения LINQ к контейнерам данных (например, массивам, коллекциям и специальным типам). Приведенная в главе информация будет полезна позже в книге при рассмотрении других API-интерфейсов.

Глава 14. Процессы, домены приложений и контексты загрузки

Опираясь на хорошее понимание вами сборок, в этой главе подробно раскрывается внутреннее устройство загруженной исполняемой сборки .NET Core. Целью главы является иллюстрация отношений между процессами, доменами приложений и контекстными границами. Упомянутые темы формируют основу для главы 15, где будет исследоваться конструирование многопоточных приложений.

Глава 15. Многопоточное, параллельное и асинхронное программирование

Эта глава посвящена построению многопоточных приложений. В ней демонстрируются приемы, которые можно использовать для написания кода, безопасного к потокам. Глава начинается с краткого напоминания о том, что собой представляет тип делегата .NET Core, и объяснения внутренней поддержки делегата для асинхронного вызова методов. Затем рассматриваются типы из пространства имен System.Threading и библиотека параллельных задач (Task Parallel Library — TPL). С применением TPL разработчики могут строить приложения .NET Core, которые распределяют рабочую нагрузку по всем доступным процессорам в исключительно простой манере. В главе также раскрыта роль API-интерфейса Parallel LINQ, который предлагает способ создания запросов LINQ, масштабируемых среди множества процессорных ядер. В завершение главы исследуется создание неблокирующих вызовов с использованием ключевых слов async/await, введенных в версии C#5, локальных функций и обобщенных возвращаемых типов async, появившихся в версии C#7, а также асинхронных потоков, добавленных в версии C#8.