Троелсен Э. Джепикс Ф. Язык программирования C#9 и платформа .NET5

Оглавление

Об авторах

О технических рецензентах

Благодарности

Введение

Авторы и читатели — одна команда

Краткий обзор книги

  Часть I. Язык программирования C# и платформа .NET 5

  Часть II. Основы программирования на C#

  Часть III. Объектно-ориентированное программирование на C#

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

  Часть V. Программирование с использованием сборок .NET Core

  Часть VI. Работа с файлами, сериализация объектов и доступ к данным

  Часть VII. Entity Framework Core

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

  Часть IX. ASP.NET Core

Ждем ваших отзывов!

Часть I

  Глава 1

   Некоторые основные преимущества инфраструктуры .NET Core

   Понятие жизненного цикла поддержки .NET Core

   Предварительный обзор строительных блоков .NET Core (.NET Runtime, CTS и CLS)

    Роль библиотек базовых классов

    Роль .NET Standard

    Что привносит язык C#

    Основные средства в предшествующих выпусках

    Новые средства в C# 9

    Сравнение управляемого и неуправляемого кода

   Использование дополнительных языков программирования, ориентированных на .NET Core

   Обзор сборок .NET

    Роль языка CIL

    Преимущества языка CIL

    Компиляция кода CIL в инструкции, специфичные для платформы

     Предварительная компиляция кода CIL в инструкции, специфичные для платформы

   Роль метаданных типов .NET Core

   Роль манифеста сборки

  Понятие общей системы типов

   Типы классов CTS

   Типы интерфейсов CTS

   Типы структур CTS

   Типы перечислений CTS

   Типы делегатов CTS

   Члены типов CTS

   Встроенные типы данных CTS

  Понятие общеязыковой спецификации

   Обеспечение совместимости с CLS

  Понятие .NET Core Runtime

  Различия между сборкой пространством имен и типом

   Доступ к пространству имен программным образом

   Ссылка на внешние сборки

  Исследование сборки с помощью ildasm.exe

  Резюме

Глава 2

  Установка .NET 5

   Понятие схемы нумерации версий .NET 5

   Подтверждение успешности установки .NET 5

   Использование более ранних версий .NET (Core) SDK

  Построение приложений .NET Core с помощью Visual Studio

   Установка Visual Studio 2019 (Windows)

    Испытание Visual Studio 2019

    Использование нового диалогового окна для создания проекта и редактора кода C#

    Изменение целевой инфраструктуры .NET Core

    Использование функциональных средств C# 9

    Запуск и отладка проекта

    Использование окна Solution Explorer

   Использование визуального конструктора классов

  Построение приложений .NET Core с помощью Visual Studio Code

   Испытание Visual Studio Code

    Создание решений и проектов

    Исследование рабочей области Visual Studio Code

    Восстановление пакетов, компиляция и запуск программ

    Отладка проекта

    Документация по .NET Core и C#

  Резюме

Часть II

Глава 3

  Структура простой программы C#

   Использование вариаций метода Main() (обновление в версии 7.1)

   Использование операторов верхнего уровня (нововведение в версии 9.0)

   Указание кода ошибки приложения (обновление в версии 9.0)

   Обработка аргументов командной строки

   Указание аргументов командной строки в Visual Studio

  Интересное отступление от темы: некоторые дополнительные члены класса System.Environment

  Использование класса System.Console

   Выполнение базового ввода и вывода с помощью класса Console

   Форматирование консольного вывода

   Форматирование числовых данных

   Форматирование числовых данных за рамками консольных приложений

  Работа с системными типами данных и соответствующими ключевыми словами C#

   Объявление и инициализация переменных

    Литерал default (нововведение в версии 7.1)

   Использование внутренних типов данных и операции new (обновление в версии 9.0)

   Иерархия классов для типов данных

   Члены числовых типов данных

   Члены System.Boolean

   Члены System.Char

   Разбор значений из строковых данных

   Использование метода TryParse() для разбора значений из строковых данных

   Использование типов System.DateTime и System.TimeSpan

   Работа с пространством имен System.Numerics

   Использование разделителей групп цифр (нововведение в версии 7.0)

   Использование двоичных литералов (нововведение в версии 7.0/7.2)

  Работа со строковыми данными

   Выполнение базовых манипуляций со строками

   Выполнение конкатенации строк

   Использование управляющих последовательностей

   Выполнение интерполяции строк

   Определение дословных строк (обновление в версии 8.0)

   Работа со строками и операциями равенства

    Модификация поведения сравнения строк

   Строки неизменяемы

   Использование типа System.Text.StringBuilder

  Сужающие и расширяющие преобразования типов данных

   Использование ключевого слова checked

   Настройка проверки переполнения на уровне проекта

   Настройка проверки переполнения на уровне проекта (Visual Studio)

   Использование ключевого слова unchecked

  Неявно типизированные локальные переменные

   Неявное объявление чисел

   Ограничения неявно типизированных переменных

   Неявно типизированные данные строго типизированы

   Полезность неявно типизированных локальных переменных

  Работа с итерационными конструкциями C#

   Использование цикла for

   Использование цикла foreach

   Использование неявной типизации в конструкциях foreach

   Использование циклов while и do/while

  Краткое обсуждение области видимости

  Работа с конструкциями принятия решений и операциями отношения/равенства

   Использование оператора if/else

   Использование операций отношения и равенства

   Использование операторов if/else и сопоставления с образцом (нововведение в версии 7.0)

   Внесение улучшений в сопоставление с образцом (нововведение в версии 9.0)

   Использование условной операции (обновление в версиях 7.2, 9.0)

   Использование логических операций

   Использование оператора switch

   Выполнение сопоставления с образцом в операторах switch (нововведение в версии 7.0, обновление в версии 9.0)

   Использование выражений switch (нововведение в версии 8.0)

  Резюме

Глава 4

  Понятие массивов C#

   Синтаксис инициализации массивов C#

   Понятие неявно типизированных локальных массивов

   Определение массива объектов

   Работа с многомерными массивами

   Использование массивов в качестве аргументов и возвращаемых значений

   Использование базового класса System.Array

   Использование индексов и диапазонов (нововведение в версии 8.0)

  Понятие методов

   Члены, сжатые до выражений

   Локальные функции (нововведение в версии 7.0, обновление в версии 9.0)

   Статические локальные функции (нововведение в версии 8.0)

  Понятие параметров методов

   Модификаторы параметров для методов

   Стандартное поведение передачи параметров

    Стандартное поведение для типов значений

    Стандартное поведение для ссылочных типов

   Использование модификатора out (обновление в версии 7.0)

    Отбрасывание параметров out (нововведение в версии 7.0)

    Модификатор out в конструкторах и инициализаторах (нововведение в версии 7.3)

   Использование модификатора ref

   Использование модификатора in (нововведение в версии 7.2)

   Использование модификатора params

   Определение необязательных параметров

   Использование именованных параметров (обновление в версии 7.2)

   Понятие перегрузки методов

  Понятие типа enum

   Управление хранилищем, лежащим в основе перечисления

   Объявление переменных типа перечисления

   Использование типа System.Enum

   Динамическое обнаружение пар "имя-значение" перечисления

   Использование перечислений, флагов и побитовых операций

  Понятие структуры (как типа значения)

   Создание переменных типа структур

   Использование структур, допускающих только чтение (нововведение в версии 7.2)

   Использование членов, допускающих только чтение (нововведение в версии 8.0)

   Использование структур ref (нововведение в версии 7.2)

   Использование освобождаемых структур ref (нововведение в версии 8.0)

  Типы значений и ссылочные типы

   Использование типов значений ссылочных типов и операции присваивания

   Использование типов значений, содержащих ссылочные типы

   Передача ссылочных типов по значению

   Передача ссылочных типов по ссылке

   Заключительные детали относительно типов значений и ссылочных типов

  Понятие типов С#, допускающих null

   Использование типов значений, допускающих null

   Использование ссылочных типов, допускающих null (нововведение в версии 8.0)

    Включение ссылочных типов, допускающих null

    Ссылочные типы, допускающие null, в действии

    Рекомендации по переносу кода

   Работа с типами, допускающими значение null

    Операция объединения с null

    Операция присваивания с объединением с null (нововведение в версии 8.0)

    null-условная операция

  Понятие кортежей (нововведение и обновление в версии 7.0)

  Начало работы с кортежами

  Использование выведенных имен переменных (обновление в версии C# 7.1)

  Понятие эквивалентности/неэквивалентности кортежей (нововведение в версии 7.3)

  Использование отбрасывания с кортежами

  Использование отбрасывания с кортежами

  Использование выражений switch с сопоставлением с образцом для кортежей (нововведение в версии 8.0)

  Деконструирование кортежей

   Деконструирование кортежей с позиционным сопоставлением с образцом (нововведение в версии 8.0)

  Резюме

Часть III

Глава 5

  Знакомство с типом класса C#

   Размещение объектов с помощью ключевого слова new

  Понятие конструкторов

   Роль стандартного конструктора

   Определение специальных конструкторов

    Конструкторы в виде членов, сжатых до выражений (нововведение в версии 7.0)

    Конструкторы с параметрами out (нововведение в версии 7.3)

   Еще раз о стандартном конструкторе

  Роль ключевого слова this

   Построение цепочки вызовов конструкторов с использованием this

   Исследование потока управления конструкторов

   Еще раз о необязательных аргументах

  Понятие ключевого слова static

   Определение статических полей данных

   Определение статических методов

   Определение статических конструкторов

   Определение статических классов

   Импортирование статических членов с применением ключевого слова using языка C#

  Основные принципы объектно-ориентированного программирования

   Роль инкапсуляции

   Роль наследования

   Роль полиморфизма

  Модификаторы доступа C# (обновление в версии 7.2)

   Использование стандартных модификаторов доступа

   Использование модификаторов доступа и вложенных типов

  Первый принцип объектно-ориентированного программирования: службы инкапсуляции C#

   Инкапсуляция с использованием традиционных методов доступа и изменения

   Инкапсуляция с использованием свойств

    Свойства как члены, сжатые до выражений (нововведение в версии 7.0)

   Использование свойств внутри определения класса

   Свойства, допускающие только чтение

   Свойства, допускающие только запись

   Смешивание закрытых и открытых методов get/set в свойствах

   Еще раз о ключевом слове static: определение статических свойств

   Сопоставление с образцом и шаблоны свойств (нововведение в версии 8.0)

  Понятие автоматических свойств

   Взаимодействие с автоматическими свойствами

   Автоматические свойства и стандартные значения

   Инициализация автоматических свойств

  Понятие инициализации объектов

   Обзор синтаксиса инициализации объектов

   Использование средства доступа только для инициализации (нововведение в версии 9.0)

   Вызов специальных конструкторов с помощью синтаксиса инициализации

   Инициализация данных с помощью синтаксиса инициализации

  Работа с константными полями данных и полями данных, допускающими только чтение

   Понятие константных полей данных

   Понятие полей данных, допускающих только чтение

   Понятие статических полей, допускающих только чтение

  Понятие частичных классов

  Использование записей (нововведение в версии 9.0)

   Эквивалентность с типами записей

   Копирование типов записей с использованием выражений with

  Резюме

Глава 6

  Базовый механизм наследования

   Указание родительского класса для существующего класса

   Замечание относительно множества базовых классов

   Использование ключевого слова sealed

  Еще раз о диаграммах классов Visual Studio

  Второй принцип объектно-ориентированного программирования: детали наследования

   Вызов конструкторов базового класса с помощью ключевого слова base

   Хранение секретов семейства: ключевое слово protected

   Добавление запечатанного класса

   Наследование с типами записей (нововведение в версии 9.0)

    Эквивалентность с унаследованными типами записей

  Реализация модели включения/делегации

   Определения вложенных типов

  Третий принцип объектно-ориентированного программирования: поддержка полиморфизма в C#

   Использование ключевых слов virtual и override

   Переопределение виртуальных членов с помощью Visual Studio/Visual Studio Code

   Запечатывание виртуальных членов

   Абстрактные классы

   Полиморфные интерфейсы

   Сокрытие членов

  Правила приведения для базовых и производных классов

   Использование ключевого слова as

   Использование ключевого слова is (обновление в версиях 7.0, 9.0)

   Использование отбрасывания вместе с ключевым словом is (нововведение в версии 7.0)

   Еще раз о сопоставлении с образцом (нововведение в версии 7.0)

    Использование отбрасывания вместе с операторами switch (нововведение в версии 7.0)

  Главный родительский класс: System.Object

   Переопределение метода System.Object.ToString()

   Переопределение метода System.Object.Equals()

   Переопределение метода System.Object.GetHashCode()

   Тестирование модифицированного класса Person

   Использование статических членов класса System.Object

  Резюме

Глава 7

  Ода ошибкам, дефектам и исключениям

  Роль обработки исключений .NET

   Строительные блоки обработки исключений в .NET

   Базовый класс System.Exception

  Простейший пример

   Генерация общего исключения

   Перехват исключений

   Выражение throw (нововведение в версии 7.0)

  Конфигурирование состояния исключения

   Свойство TargetSite

   Свойство StackTrace

   Свойство HelpLink

   Свойство Data

  Исключения уровня системы (System.SystemException)

  Исключения уровня приложения (Systern.ApplicationException)

   Построение специальных исключений, способ первый

   Построение специальных исключений, способ второй

   Построение специальных исключений, способ третий

  Обработка множества исключений

   Общие операторы catch

   Повторная генерация исключений

   Внутренние исключения

   Блок finally

   Фильтры исключений

  Отладка необработанных исключений с использованием Visual Studio

  Резюме

Глава 8

  Понятие интерфейсных типов

   Сравнение интерфейсных типов и абстрактных базовых классов

  Определение специальных интерфейсов

  Реализация интерфейса

  Обращение к членам интерфейса на уровне объектов

   Получение ссылок на интерфейсы: ключевое слово as

   Получение ссылок на интерфейсы: ключевое слово is (обновление в версии 7.0)

  Стандартные реализации (нововведение в версии 8.0)

  Статические конструкторы и члены (нововведение в версии 8.0)

  Использование интерфейсов в качестве параметров

  Использование интерфейсов в качестве возвращаемых значений

  Массивы интерфейсных типов

  Автоматическая реализация интерфейсов

  Явная реализация интерфейсов

  Проектирование иерархий интерфейсов

   Иерархии интерфейсов со стандартными реализациями (нововведение в версии 8.0)

   Множественное наследование с помощью интерфейсных типов

  Интерфейсы IEnumerable и IEnumerator

   Построение итераторных методов с использованием ключевого слова yield

    Защитные конструкции с использованием локальных функций (нововведение в версии 7.0)

   Построение именованного итератора

  Интерфейс ICloneable

   Более сложный пример клонирования

  Интерфейс IComparable

   Указание множества порядков сортировки с помощью IComparer

   Специальные свойства и специальные типы сортировки

  Резюме

Глава 9

  Классы, объекты и ссылки

  Базовые сведения о времени жизни объектов

   Код CIL для ключевого слова new

   Установка объектных ссылок в null

  Выяснение, нужен ли объект

  Понятие поколений объектов

   Эфемерные поколения и сегменты

  Типы сборки мусора

   Фоновая сборка мусора

  Тип System.GC

   Принудительный запуск сборщика мусора

  Построение финализируемых объектов

   Переопределение метода System.Object.Finalize()

   Подробности процесса финализации

  Построение освобождаемых объектов

   Повторное использование ключевого слова using в C#

   Объявления using (нововведение в версии 8.0)

  Создание финализируемых и освобождаемых типов

   Формализованный шаблон освобождения

  Ленивое создание объектов

   Настройка процесса создания данных Lazy<>

  Резюме

Часть IV

Глава 10

  Побудительные причины создания классов коллекций

   Пространство имен System.Collections

    Иллюстративный пример: работа с ArrayList

   Обзор пространства имен System.Collections.Specialized

  Проблемы, присущие необобщенным коллекциям

   Проблема производительности

   Проблема безопасности в отношении типов

   Первый взгляд на обобщенные коллекции

  Роль параметров обобщенных типов

   Указание параметров типа для обобщенных классов и структур

   Указание параметров типа для обобщенных членов

   Указание параметров типов для обобщенных интерфейсов

  Пространство имен System.Collections.Generic

   Синтаксис инициализации коллекций

   Работа с классом List

   Работа с классом Stack

   Работа с классом Queue

   Работа с классом SortedSet

   Работа с классом Dictionary

  Пространство имен System.Collections.ObjectModel

   Работа с классом ObservableCollection

  Создание специальных обобщенных методов

   Выведение параметров типа

  Создание специальных обобщенных структур и классов

   Выражения default вида значений в обобщениях

   Выражения default литерального вида (нововведение в версии 7.1)

   Сопоставление с образцом в обобщениях (нововведение в версии 7.1)

  Ограничение параметров типа

   Примеры использования ключевого слова where

   Отсутствие ограничений операций

  Резюме

Глава 11

  Понятие индексаторных методов

   Индексация данных с использованием строковых значений

   Перегрузка индексаторных методов

   Многомерные индексаторы

   Определения индексаторов в интерфейсных типах

  Понятие перегрузки операций

   Перегрузка бинарных операций

   А как насчет операций += и -=?

   Перегрузка унарных операций

   Перегрузка операций эквивалентности

   Перегрузка операций сравнения

   Финальные соображения относительно перегрузки операций

  Понятие специальных преобразований типов

   Повторение: числовые преобразования

   Повторение: преобразования между связанными типами классов

   Создание специальных процедур преобразования

   Дополнительные явные преобразования для типа Square

   Определение процедур неявного преобразования

  Понятие расширяющих методов

   Определение расширяющих методов

   Вызов расширяющих методов

   Импортирование расширяющих методов

   Расширение типов, реализующих специфичные интерфейсы

   Поддержка расширяющего метода GetEnumerator() (нововведение в версии 9.0)

  Понятие анонимных типов

   Определение анонимного типа

   Внутреннее представление анонимных типов

   Реализация методов ToString() и GetHashCode()

   Семантика эквивалентности анонимных типов

   Анонимные типы, содержащие другие анонимные типы

  Работа с типами указателей

   Ключевое слово unsafe

   Работа с операциями * и &

   Небезопасная (и безопасная) функция обмена

   Доступ к полям через указатели (операция ->)

   Ключевое слово stackalloc

   Закрепление типа посредством ключевого слова fixed

   Ключевое слово sizeof

  Резюме

Глава 12

  Понятие типа делегата

   Определение типа делегата в C#

   Базовые классы System.MulticastDelegate и System.Delegate

  Пример простейшего делегата

   Исследование объекта делегата

  Отправка уведомлений о состоянии объекта с использованием делегатов

   Включение группового вызова

   Удаление целей из списка вызовов делегата

   Синтаксис групповых преобразований методов

  Понятие обобщенных делегатов

   Обобщенные делегаты Action<> и Func<>

  Понятие событий C#

   Ключевое слово event

   "За кулисами" событий

   Прослушивание входящих событий

   Упрощение регистрации событий с использованием Visual Studio

   Создание специальных аргументов событий

   Обобщенный делегат EventHandler

  Понятие анонимных методов C#

   Доступ к локальным переменным

   Использование ключевого слова static с анонимными методами (нововведение в версии 9.0)

   Использование отбрасывания с анонимными методами (нововведение в версии 9.0)

  Понятие лямбда-выражений

   Анализ лямбда-выражения

   Обработка аргументов внутри множества операторов

   Лямбда-выражения с несколькими параметрами и без параметров

   Использование ключевого слова static с лямбда-выражениями (нововведение в версии 9.0)

   Использование отбрасывания с лямбда-выражениями (нововведение в версии 9.0)

   Модернизация примера CarEvents с использованием лямбда-выражений

   Лямбда-выражения и члены, сжатые до выражений (обновление в версии 7.0)

  Резюме

Глава 13

  Программные конструкции, специфичные для LINQ

   Неявная типизация локальных переменных

   Синтаксис инициализации объектов и коллекций

   Лямбда-выражения

   Расширяющие методы

   Анонимные типы

  Роль LINQ

   Выражения LINQ строго типизированы

   Основные сборки LINQ

  Применение запросов LINQ к элементарным массивам

   Решение с использованием расширяющих методов

   Решение без использования LINQ

   Выполнение рефлексии результирующего набора LINQ

   LINQ и неявно типизированные локальные переменные

   LINQ и расширяющие методы

   Роль отложенного выполнения

   Роль немедленного выполнения

  Возвращение результатов запроса LINQ

   Возвращение результатов LINQ посредством немедленного выполнения

  Применение запросов LINQ к объектам коллекций

   Доступ к содержащимся в контейнере подобъектам

   Применение запросов LINQ к необобщенным коллекциям

   Фильтрация данных с использованием метода OfТуре<Т>()

  Исследование операций запросов LINQ

   Базовый синтаксис выборки

   Получение подмножества данных

   Проецирование в новые типы данных

   Проецирование в другие типы данных

   Подсчет количества с использованием класса Enumerable

   Изменение порядка следования элементов в результирующих наборах на противоположный

   Выражения сортировки

   LINQ как лучшее средство построения диаграмм Венна

   Устранение дубликатов

   Операции агрегирования LINQ

  Внутреннее представление операторов запросов LINQ

   Построение выражений запросов с применением операций запросов

   Построение выражений запросов с использованием типа Enumerable и лямбда-выражений

   Построение выражений запросов с использованием типа Enumerable и анонимных методов

   Построение выражений запросов с использованием типа Enumerable и низкоуровневых делегатов

  Резюме

Глава 14

  Роль процесса Windows

   Роль потоков

  Взаимодействие с процессами используя платформу .NET Core

   Перечисление выполняющихся процессов

   Исследование конкретного процесса

   Исследование набора потоков процесса

   Исследование набора модулей процесса

   Запуск и останов процессов программным образом

   Управление запуском процесса с использованием класса ProcessStartInfo

   Использование команд операционной системы с классом ProcessStartInfo

  Домены приложений .NET

   Класс System.AppDomain

   Взаимодействие со стандартным доменом приложения

   Перечисление загруженных сборок

  Изоляция сборок с помощью контекстов загрузки приложений

  Итоговые сведения о процессах, доменах приложений и контекстах загрузки

  Резюме

Глава 15

  Отношения между процессом, доменом приложения, контекстом и потоком

   Сложность, связанная с параллелизмом

   Роль синхронизации потоков

  Пространство имен System.Threading

  Класс System.Threading.Thread

   Получение статистических данных о текущем потоке выполнения

   Свойство Name

   Свойство Priority

  Ручное создание вторичных потоков

   Работа с делегатом ThreadStart

   Работа с делегатом ParametrizedThreadStart

   Класс AutoResetEvent

   Потоки переднего плана и фоновые потоки

  Проблема параллелизма

   Синхронизация с использованием ключевого слова lock языка C#

   Синхронизация с использованием типа System.Threading.Monitor

   Синхронизация с использованием типа System.Threading.Interlocked

  Программирование с использованием обратных вызовов Timer

   Использование автономного отбрасывания (нововведение в версии 7.0)

  Класс ThreadPool

  Параллельное программирование с использованием TPL

   Пространство имен System.Threading.Tasks

   Роль класса Parallel

   Обеспечение параллелизма данных с помощью класса Parallel

   Доступ к элементам пользовательского интерфейса во вторичных потоках

   Класс Task

   Обработка запроса на отмену

   Обеспечение параллелизма задач с помощью класса Parallel

  Запросы Parallel LINQ (PLINQ)

   Создание запроса PLINQ

   Отмена запроса PLINQ

  Асинхронные вызовы с помощью async/await

   Знакомство с ключевыми словами async и await языка C# (обновление в версиях 7.1, 9.0)

   Класс SynchronizationContext и async/await

   Роль метода ConfigureAwait()

   Соглашения об именовании асинхронных методов

   Асинхронные методы, возвращающие void

    Асинхронные методы, возвращающие void и поддерживающие await

    Асинхронные методы, возвращающие void и работающие в стиле "запустил и забыл"

    Асинхронные методы с множеством контекстов await

   Вызов асинхронных методов из неасинхронных методов

   Ожидание с помощью await в блоках catch и finally

   Обобщенные возвращаемые типы в асинхронных методах (нововведение в версии 7.0)

   Локальные функции (нововведение в версии 7.0)

   Отмена операций async/await

   Асинхронные потоки (нововведение в версии 8.0)

   Итоговые сведения о ключевых словах async и await

  Резюме

Часть V

Глава 16

  Определение специальных пространств имен

   Разрешение конфликтов имен с помощью полностью заданных имен

   Разрешение конфликтов имен с помощью псевдонимов

   Создание вложенных пространств имен

   Изменение стандартного пространства имен в Visual Studio

  Роль сборок .NET Core

   Сборки содействуют многократному использованию кода

   Сборки устанавливают границы типов

   Сборки являются единицами, поддерживающими версии

   Сборки являются самоописательными

  Формат сборки .NET Core

   Установка инструментов профилирования C++

   Заголовок файла операционной системы (Windows)

   Заголовок файла CLR

   Код CIL, метаданные типов и манифест сборки

   Дополнительные ресурсы сборки

  Отличия между библиотеками классов и консольными приложениями

  Отличия между библиотеками классов .NET Standard и .NET Core

  Конфигурирование приложений

  Построение и потребление библиотеки классов .NET Core

   Исследование манифеста

   Исследование кода CIL

   Исследование метаданных типов

   Построение клиентского приложения C#

   Построение клиентского приложения Visual Basic

   Межъязыковое наследование в действии

   Открытие доступа к внутренним типам для других сборок

    Использование атрибута assembly

    Использование файла проекта

  NuGet и .NET Core

   Пакетирование сборок с помощью NuGet

   Ссылка на пакеты NuGet

  Опубликование консольных приложений (обновление в версии .NET 5)

   Опубликование приложений, зависящих от инфраструктуры

   Опубликование автономных приложений

    Опубликование автономных приложений в виде единственного файла

  Определение местонахождения сборок исполняющей средой .NET Core

  Резюме

Глава 17

  Потребность в метаданных типов

   Просмотр (частичных) метаданных для перечисления EngineStateEnum

   Просмотр (частичных) метаданных для типа Car

   Исследование блока TypeRef

   Документирование определяемой сборки

   Документирование ссылаемых сборок

   Документирование строковых литералов

  Понятие рефлексии

   Класс System.Туре

   Получение информации о типе с помощью System.Object.GetType()

   Получение информации о типе с помощью typeof()

   Получение информации о типе с помощью System.Туре.GetType()

  Построение специального средства для просмотра метаданных

   Рефлексия методов

   Рефлексия полей и свойств

   Рефлексия реализованных интерфейсов

   Отображение разнообразных дополнительных деталей

   Добавление операторов верхнего уровня

   Рефлексия статических типов

   Рефлексия обобщенных типов

   Рефлексия параметров и возвращаемых значений методов

   Динамическая загрузка сборок

  Рефлексия сборок инфраструктуры

  Понятие позднего связывания

   Класс System.Activato

   Вызов методов без параметров

   Вызов методов с параметрами

  Роль атрибутов .NET

   Потребители атрибутов

   Применение атрибутов в C#

   Сокращенная система обозначения атрибутов C#

   Указание параметров конструктора для атрибутов

   Атрибут [Obsolete] в действии

  Построение специальных атрибутов

   Применение специальных атрибутов

   Синтаксис именованных свойств

   Ограничение использования атрибутов

  Атрибуты уровня сборки

   Использование файла проекта для атрибутов сборки

  Рефлексия атрибутов с использованием раннего связывания

  Рефлексия атрибутов с использованием позднего связывания

  Практическое использование рефлексии позднего связывания и специальных атрибутов

  Построение расширяемого приложения

   Построение мультипроектного решения ExtendableApp

    Создание решения и проектов с помощью интерфейса командной строки

     Добавление событий PostBuild в файлы проектов

    Создание решения и проектов с помощью Visual Studio

    Установка зависимостей проектов при компиляции

     Добавление событий PostBuild

   Построение сборки CommonSnappableTypes.dll

   Построение оснастки на C#

   Построение оснастки на Visual Basic

   Добавление кода для ExtendableApp

  Резюме

Глава 18

  Роль ключевого слова dynamic языка C#

   Вызов членов на динамически объявленных данных

   Область использования ключевого слова dynamic

   Ограничения ключевого слова dynamic

   Практическое использование ключевого слова dynamic

  Роль исполняющей среды динамического языка

   Роль деревьев выражений

   Динамический поиск в деревьях выражений во время выполнения

  Упрощение вызовов с поздним связыванием посредством динамических типов

   Использование ключевого слова dynamic для передачи аргументов

  Упрощение взаимодействия с СОМ посредством динамических данных (только Windows)

   Роль основных сборок взаимодействия

   Встраивание метаданных взаимодействия

   Общие сложности взаимодействия с СОМ

  Взаимодействие с СОМ с использованием динамических данных C#

  Резюме

Глава 19

  Причины для изучения грамматики языка CIL

  Директивы, атрибуты и коды операций CIL

   Роль директив CIL

   Роль атрибутов CIL

   Роль кодов операций СIL

   Разница между кодами операций и их мнемоническими эквивалентами в СIL

  Заталкивание и выталкивание: основанная на стеке природа CIL

  Возвратное проектирование

   Роль меток в коде CIL

   Взаимодействие c CIL: модификация файла *.il

   Компиляция кода CIL

  Директивы и атрибуты CIL

   Указание ссылок на внешние сборки в CIL

   Определение текущей сборки в CIL

   Определение пространств имен в CIL

   Определение типов классов в CIL

   Определение и реализация интерфейсов в CIL

   Определение структур в CIL

   Определение перечислений в CIL

   Определение обобщений в CIL

  Компиляция файла CILTypes.il

  Соответствия между типами данных в библиотеке базовых классов .NET Core, C# и CIL

   Определение членов типов в CIL

   Определение полей данных в CIL

   Определение конструкторов типа в CIL

   Определение свойств в CIL

   Определение параметров членов

  Исследование кодов операций CIL

   Директива .maxstack

   Объявление локальных переменных в CIL

   Отображение параметров на локальные переменные в CIL

   Скрытая ссылка this

   Представление итерационных конструкций в CIL

   Заключительные слова о языке CIL

  Динамические сборки

   Исследование пространства имен System.Reflection.Emit

   Роль типа System.Reflection.Emit.ILGenerator

   Выпуск динамической сборки

   Выпуск сборки и набора модулей

   Роль типа ModuleBuilder

   Выпуск типа HelloClass и строковой переменной-члена

   Выпуск конструкторов

   Выпуск метода SayHello()

   Использование динамически сгенерированной сборки

  Резюме

   Часть VI

Глава 20

  Исследование пространства имен System.IO

  Классы Directory(Directorylnfо) и File(FileInfo)

   Абстрактный базовый класс FileSystemInfo

  Работа с типом DirectoryInfо

   Перечисление файлов с помощью типа DirectoryInfо

   Создание подкаталогов с помощью типа DirectoryInfo

  Работа с типом Directory

  Работа с типом DriveInfo

  Работа с типом FileInfo

   Метод FileInfo.Create()

   Метод FileInfо.Open()

   Методы FileInfо.OpenRead() и FileInfо.OpenWrite()

   Метод FileInfо.OpenText()

   Методы FileInfo.CreateText() и FileInfo.AppendText()

  Работа с типом File

   Дополнительные члены типа File

  Абстрактный класс Stream

   Работа с типом FileStream

  Работа с типами StreamWriter и StreamReader

   Запись в текстовый файл

   Чтение из текстового файла

   Прямое создание объектов типа StreamWriter/StreamReader

  Работа с типами StringWriter и StringReader

  Работа с типами BinaryWriter и BinaryReader

  Программное слежение за файлами

  Понятие сериализации объектов

   Роль графов объектов

   Создание примеров типов и написание операторов верхнего уровня

   Сериализация и десериализация с помощью XmlSerializer

    Управление генерацией данных XML

    Сериализация объектов с использованием XmlSerializer

    Сериализация коллекций объектов

    Десериализация объектов и коллекций объектов

   Сериализация и десериализация с помощью System.Text.Json

    Управление генерацией данных JSON

    Сериализация объектов с использованием JsonSerializer

    Включение полей

    Понятный для человека вывод данных JSON

    Именование элементов JSON в стиле Pascal или в "верблюжьем" стиле

    Обработка чисел с помощью JsonSerializer

    Потенциальные проблемы, связанные с производительностью, при использовании JsonSerializerOption

    Стандартные настройки свойств JsonSerializer для веб-приложений

    Сериализация коллекций объектов

    Десериализация объектов и коллекций объектов

  Резюме

Глава 21

  Сравнение ADO.NET и ADO

  Поставщики данных ADO.NET

   Поставщики данных ADO.NET

  Типы из пространства имен System.Data

   Роль интерфейса IDbConnection

   Роль интерфейса IDbTransaction

   Роль интерфейса IDbCommand

   Роль интерфейсов IDbDataParameter и IDataParameter

   Роль интерфейсов IDbDataAdapter и IDataAdapter

   Роль интерфейсов IDataReader и IDataRecord

  Абстрагирование поставщиков данных с использованием интерфейсов

  Установка SQL Server и Azure Data Studio

   Установка SQL Server

    Установка SQL Server в контейнер Docker

    Получение образа и запуск SQL Server 2019

    Установка SQL Server 2019

   Установка IDE-среды SQL Server

   Подключение к SQL Server

    Подключение к SQL Server в контейнере Docker

    Подключение к SQL Server LocalDb

    Подключение к любому другому экземпляру SQL Server

  Восстановление базы данных AutoLot из резервной копии

   Копирование файла резервной копии в имеющийся контейнер

   Восстановление базы данных с помощью SSMS

    Восстановление базы данных в экземпляр SQL Server (Docker)

    Восстановление базы данных в экземпляр SQL Server (Windows)

   Восстановление базы данных с помощью Azure Data Studio

  Создание базы данных AutoLot

   Создание базы данных

   Создание таблиц

    Создание таблицы Inventory

    Создание таблицы Makes

    Создание таблицы Customers

    Создание таблицы Orders

    Создание таблицы CreditRisks

   Создание отношений между таблицами

    Создание отношения между таблицами Inventory и Makes

    Создание отношения между таблицами Inventory и Orders

    Создание отношения между таблицами Orders и Customers

    Создание отношения между таблицами Customers и CreditRisks

   Создание хранимой процедуры GetPetName

   Добавление тестовых записей

    Записи таблицы Makes

    Записи таблицы Inventory

    Добавление тестовых записей в таблицу Customers

    Добавление тестовых записей в таблицу Orders

    Добавление тестовых записей в таблицу CreditRisks

  Модель фабрики поставщиков данных ADO.NET

   Полный пример фабрики поставщиков данных

   Потенциальный недостаток модели фабрики поставщиков данных

  Погружение в детали объектов подключений, команд и чтения данных

   Работа с объектами подключений

    Работа с объектами ConnectionStringBuilder

   Работа с объектами команд

   Работа с объектами чтения данных

    Получение множества результирующих наборов с использованием объекта чтения данных

   Работа с запросами создания обновления и удаления

    Создание классов Car и CarViewModel

    Добавление класса InventoryDal

     Добавление конструкторов

     Открытие и закрытие подключения

    Добавление реализации IDisposable

     Добавление методов выборки

     Вставка новой записи об автомобиле

    Создание строго типизированного метода InsertCar()

    Добавление логики удаления

    Добавление логики обновления

    Работа с параметризированным и объектами команд

     Указание параметров с использованием типа DbParameter

     Обновление метода GetCar()

     Обновление метода DeleteCar()

     Обновление метода UpdateCarPetName()

     Обновление метода InsertAuto()

    Выполнение хранимой процедуры

  Создание консольного клиентского приложения

  Понятие транзакций базы данных

   Основные члены объекта транзакции ADO.NET

  Добавление метода транзакции в inventoryDal

   Тестирование транзакции базы данных

  Выполнение массового копирования с помощью ADO.NET

   Исследование класса SqlBulkCopy

   Создание специального класса чтения данных

   Выполнение массового копирования

   Тестирование массового копирования

  Резюме

Часть VII

Глава 22

  Инструменты объектно-реляционного отображения

  Роль Entity Framework Core

  Строительные блоки Entity Framework Core

   Класс DbContext

    Создание класса, производного от DbContext

     Конфигурирование экземпляра DbContext

     Фабрика DbContext этапа проектирования

     Метод OnModelCreating()

     Сохранение изменений

    Поддержка транзакций и точек сохранения

    Транзакции и стратегии выполнения

     События SavingChanges/SavedChanges

    Класс DbSet

     Типы запросов

     Гибкое сопоставление с запросом или таблицей

    Экземпляр ChangeTracker

     События ChangeTracker

     Сброс состояния DbContext

    Сущности

     Сопоставление свойств со столбцами

     Сопоставление классов с таблицами

      Сопоставление "таблица на иерархию" (ТРН)

      Сопоставление "таблица на тип" (ТРТ)

     Навигационные свойства и внешние ключи

      Отсутствие свойств для внешних ключей

      Отношения "один ко многим"

      Отношения "один к одному"

      Отношения "многие ко многим" (нововведение в версии EF Core 5)

      Каскадное поведение

      Необязательные отношения

      Обязательные отношения

     Соглашения, связанные с сущностями

      Отображение свойств на столбцы

     Аннотации данных Entity Framework

      Аннотации и навигационные свойства

     Интерфейс Fluent API

      Отображение классов и свойств

      Стандартные значения

      Вычисляемые столбцы

      Отношения "один ко многим"

      Отношения "один к одному"

      Отношения "многие ко многим"

     Соглашения, аннотации данных и Fluent API — что выбрать?

  Выполнение запросов

   Смешанное выполнение на клиентской и серверной сторонах

  Сравнение отслеживаемых и неотслеживаемых запросов

  Важные функциональные средства EF Core

   Обработка значений, генерируемых базой данных

   Проверка параллелизма

   Устойчивость подключений

   Связанные данные

    Энергичная загрузка

     Фильтрованные включаемые данные

     Энергичная загрузка с разделением запросов

    Явная загрузка

    Ленивая загрузка

   Глобальные фильтры запросов

    Глобальные фильтры запросов на навигационных свойствах

    Явная загрузка с глобальными фильтрами запросов

   Выполнение низкоуровневых запросов SQL с помощью LINQ

   Пакетирование операторов

   Принадлежащие сущностные типы

   Сопоставление с функциями базы данных

  Команды CLI глобального инструмента EF Core

   Команды для управления миграциями

    Команда add

     Исключение таблиц из миграций

    Команда remove

    Команда list

    Команда script

   Команды для управления базой данных

    Команда drop

    Команда update

   Команды для управления типами DbContext

    Команда scaffold

  Резюме

Глава 23

  "Сначала код" или "сначала база данных"

  Создание проектов AutoLot.Dal и AutoLot.Models

  Создание шаблонов для класса, производного от DbContext, и сущностных классов

  Переключение на подход "сначала код"

   Создание фабрики экземпляров класса, производного от DbContext, на этапе проектирования

   Создание начальной миграции

   Применение миграции

  Обновление модели

   Сущности

    Класс BaseEntity

    Принадлежащий сущностный класс Person

    Сущность Car(Inventory)

    Сущность Customer

    Сущность Make

    Сущность CreditRisk

    Сущность Order

    Сущность SeriLogEntry

   Класс ApplicationDbContext

    Обновление кода Fluent API

     Сущность SeriLogEntry

     Сущность CreditRisk

     Сущность Customer

     Сущность Make

     Сущность Order

     Сущность Car

    Специальные исключения

    Переопределение метода SaveChanges()

    Обработка событий DbContext и ChangeTracker

   Создание миграции и обновление базы данных

  Добавление представления базы данных и хранимой процедуры

   Добавление класса MigrationHelpers

   Обновление и применение миграции

  Добавление модели представления

   Добавление класса модели представления

   Добавление класса модели представления к ApplicationDbContext

  Добавление хранилищ

   Добавление базового интерфейса IRepo

   Добавление класса BaseRepo

    Реализация метода SaveChanges()

    Реализация общих методов чтения

    Реализация методов добавления, обновления и удаления

   Интерфейсы хранилищ, специфичных для сущностей

    Интерфейс хранилища данных об автомобилях

    Интерфейс хранилища данных о кредитных рисках

    Интерфейс хранилища данных о заказчиках

    Интерфейс хранилища данных о производителях

    Интерфейс хранилища данных о заказах

   Реализация классов хранилищ, специфичных для сущностей

    Хранилище данных об автомобилях

    Хранилище данных о кредитных рисках

    Хранилище данных о заказчиках

    Хранилище данных о производителях

    Хранилище данных о заказах

  Программная работа с базой данных и миграциями

   Удаление, создание и очистка базы данных

  Инициализация базы данных

   Создание выборочных данных

   Загрузка выборочных данных

  Настройка тестов

   Создание проекта

   Конфигурирование проекта

   Создание класса TestHelpers

   Добавление класса BaseTest

    Добавление вспомогательных методов для выполнения тестов в транзакциях

   Добавление класса тестовой оснастки EnsureAutoLotDatabase

   Добавление классов интеграционных тестов

    Тестовые методы [Fact] и [Theory]

   Выполнение тестов

  Запрашивание базы данных

   Состояние сущности

   Запросы LINQ

    Выполнение запросов LINQ

    Получение всех записей

    Фильтрация записей

    Сортировка записей

     Сортировка записей в обратном порядке

    Извлечение одиночной записи

     Использование First()/FirstOrDefault()

     Использование Last()/LastOrDefault()

     Использование Single()/SingleOrDefault()

    Глобальные фильтры запросов

     Отключение глобальных фильтров запросов

     Фильтры запросов для навигационных свойств

    Энергичная загрузка связанных данных

     Разделение запросов к связанным данным

     Фильтрация связанных данных

     Явная загрузка связанных данных

    Явная загрузка связанных данных с фильтрами запросов

   Выполнение запросов SQL с помощью LINQ

   Методы агрегирования

   Any() и All()

   Получение данных из хранимых процедур

  Создание записей

   Состояние сущности

   Добавление одной записи

   Добавление одной записи с использованием метода Attach()

   Добавление нескольких записей одновременно

   Соображения относительно столбца идентичности при добавлении записей

   Добавление объектного графа

  Обновление записей

   Состояние сущности

   Обновление отслеживаемых сущностей

   Обновление неотслеживаемых сущностей

   Проверка параллелизма

  Удаление записей

   Состояние сущности

   Удаление отслеживаемых сущностей

   Удаление неотслеживаемых сущностей

   Перехват отказов каскадного удаления

   Проверка параллелизма

  Резюме

Часть VIII

Глава 24

  Побудительные причины создания WPF

   Унификация несходных API-интерфейсов

   Обеспечение разделения обязанностей через XAML

   Обеспечение оптимизированной модели визуализации

   Упрощение программирования сложных пользовательских интерфейсов

  Исследование сборок WPF

   Роль класса Application

   Построение класса приложения

   Перечисление элементов коллекции Windows

   Роль класса Window

    Роль класса System.Windows.Controls.ContentControl

    Роль класса System.Windows.Controls.Control

    Роль класса System.Windows.FrameworkElement

    Роль класса System.Windows.UIElement

    Роль класса System.Windows.Media.Visual

    Роль класса System.Windows.DependencyObject

    Роль класса System.Windows.Threading.DispatcherObject

  Синтаксис XAML для WPF

   Введение в Kaxaml

   Пространства имен XML и "ключевые слова" XAML

   Управление видимостью классов и переменных-членов

   Элементы XAML, атрибуты XAML и преобразователи типов

   Понятие синтаксиса "свойство-элемент" в XAML

   Понятие присоединяемых свойств XAML

   Понятие расширений разметки XAML

  Построение приложений WPF с использованием Visual Studio

   Шаблоны проектов WPF

   Панель инструментов и визуальный конструктор/редактор XAML

   Установка свойств с использованием окна Properties

   Обработка событий с использованием окна Properties

   Обработка событий в редакторе XAML

   Окно Document Outline

   Включение и отключение отладчика XAML

   Исследование файла Арр.xaml

   Отображение разметки XAML окна на код C#

   Роль BAML

   Разгадывание загадки Main()

   Взаимодействие с данными уровня приложения

   Обработка закрытия объекта Window

   Перехват событий мыши

   Перехват событий клавиатуры

  Резюме

Глава 25

  Обзор основных элементов управления WPF

  Элементы управления для работы с Ink API

   Элементы управления для работы с документами WPF

   Общие диалоговые окна WPF

  Краткий обзор визуального конструктора WPF в Visual Studio

   Работа с элементами управления WPF в Visual Studio

   Работа с окном Document Outline

  Управление компоновкой содержимого с использованием панелей

   Позиционирование содержимого внутри панелей Canvas

   Позиционирование содержимого внутри панелей WrapPanel

   Позиционирование содержимого внутри панелей StackPanel

   Позиционирование содержимого внутри панелей Grid

   Установка размеров столбцов и строк в панели Grid

   Панели Grid с типами GridSplitter

   Позиционирование содержимого внутри панелей DockPanel

   Включение прокрутки в типах панелей

   Конфигурирование панелей с использованием визуальных конструкторов Visual Studio

  Построение окна с использованием вложенных панелей

   Построение системы меню

   Визуальное построение меню

   Построение панели инструментов

   Построение строки состояния

   Завершение проектирования пользовательского интерфейса

   Реализация обработчиков событий MouseEnter/MouseLeave

   Реализация логики проверки правописания

  Понятие команд WPF

   Внутренние объекты команд

   Подключение команд к свойству Command

   Подключение команд к произвольным действиям

   Работа с командами Open и Save

  Понятие маршрутизируемых событий

   Роль пузырьковых маршрутизируемых событий

   Продолжение или прекращение пузырькового распространения

   Роль туннельных маршрутизируемых событий

  Более глубокое исследование API-интерфейсов и элементов управления WPF

   Работа с элементом управления TabControl

  Построение вкладки Ink API

   Проектирование панели инструментов

   Элемент управления RadioButton

   Добавление кнопок сохранения, загрузки и удаления

   Добавление элемента управления InkCanvas

   Предварительный просмотр окна

   Обработка событий для вкладки Ink API

   Добавление элементов управления в панель инструментов

   Элемент управления InkCanvas

   Элемент управления ComboBox

   Сохранение, загрузка и очистка данных InkCanvas

  Введение в модель привязки данных WPF

   Построение вкладки Data Binding

   Установка привязки данных

   Свойство DataContext

   Форматирование привязанных данных

   Преобразование данных с использованием интерфейса IValueConverter

   Установление привязок данных в коде

   Построение вкладки DataGrid

  Роль свойств зависимости

   Исследование существующего свойства зависимости

   Важные замечания относительно оболочек свойств CLR

  Построение специального свойства зависимости

   Добавление процедуры проверки достоверности данных

   Реагирование на изменение свойства

  Резюме

Глава 26

  Понятие служб визуализации графики WPF

   Варианты графической визуализации WPF

   Визуализация графических данных с использованием фигур

   Добавление прямоугольников, эллипсов и линий на поверхность Canvas

   Удаление прямоугольников, эллипсов и линий с поверхности Canvas

   Работа с элементами Polyline и Polygon

   Работа с элементом Path

    "Мини-язык" моделирования путей

  Кисти и перья WPF

   Конфигурирование кистей с использованием Visual Studio

   Конфигурирование кистей в коде

   Конфигурирование перьев

  Применение графических трансформаций

   Первый взгляд на трансформации

   Трансформация данных Canvas

  Работа с редактором трансформаций Visual Studio

   Построение начальной компоновки

   Применение трансформаций на этапе проектирования

   Трансформация холста в коде

  Визуализация графических данных с использованием рисунков и геометрических объектов

   Построение кисти DrawingBrush с использованием геометрических объектов

   Рисование с помощью DrawingBrush

   Включение типов Drawing в DrawingImage

  Работа с векторными изображениями

   Преобразование файла с векторной графикой в файл XAML

   Импортирование графических данных в проект WPF

   Взаимодействие с изображением

  Визуализация графических данных с использованием визуального уровня

   Базовый класс Visual и производные дочерние классы

   Первый взгляд на класс DrawingVisual

   Визуализация графических данных в специальном диспетчере компоновки

   Реагирование на операции проверки попадания

  Резюме

Глава 27

  Система ресурсов WPF

   Работа с двоичными ресурсами

    Включение в проект несвязанных файлов ресурсов

    Конфигурирование несвязанных ресурсов

    Программная загрузка изображения

    Встраивание ресурсов приложения

  Работа с объектными (логическими) ресурсами

   Роль свойства Resources

   Определение ресурсов уровня окна

   Расширение разметки {StaticResource}

   Расширение разметки {DynamicResource}

   Ресурсы уровня приложения

   Определение объединенных словарей ресурсов

   Определение сборки, включающей только ресурсы

  Службы анимации WPF

   Роль классов анимации

   Свойства То, From и By

   Роль базового класса Timeline

   Реализация анимации в коде C#

   Управление темпом анимации

   Запуск в обратном порядке и циклическое выполнение анимации

  Реализация анимации в разметке XAML

   Роль раскадровок

   Роль триггеров событий

   Анимация с использованием дискретных ключевых кадров

  Роль стилей WPF

   Определение и применение стиля

   Переопределение настроек стиля

   Влияние атрибута TargetType на стили

   Создание подклассов существующих стилей

   Определение стилей с триггерами

   Определение стилей с множеством триггеров

   Стили с анимацией

   Применение стилей в коде

  Логические деревья, визуальные деревья и стандартные шаблоны

   Программное инспектирование логического дерева

   Программное инспектирование визуального дерева

   Программное инспектирование стандартного шаблона элемента управления

  Построение шаблона элемента управления с помощью инфраструктуры триггеров

   Шаблоны как ресурсы

   Встраивание визуальных подсказок с использованием триггеров

   Роль расширения разметки {TemplateBinding}

   Роль класса ContentPresenter

   Встраивание шаблонов в стили

  Резюме

Глава 28

  Введение в паттерн MWM

   Модель

   Представление

   Модель представления

   Анемичные модели или анемичные модели представлений

  Система уведомлений привязки WPF

   Наблюдаемые модели и коллекции

   Добавление привязок и данных

   Изменение данных об автомобиле в коде

   Наблюдаемые модели

    Использование операции nameof

    Наблюдаемые коллекции

    Использование класса ObservableCollection

    Реализация флага изменения

    Обновление источника через взаимодействие с пользовательским интерфейсом

   Итоговые сведения об уведомлениях и наблюдаемых моделях

  Проверка достоверности WPF

   Модификация примера для демонстрации проверки достоверности

   Класс Validation

   Варианты проверки достоверности

    Уведомление по исключениям

    Интерфейс IDataErrorInfo

    Интерфейс INotifyDataErrorInfo

    Реализация поддерживающего кода

    Использование интерфейса INotifyDataErrorInfo для проверки достоверности

    Комбинирование IDataErrorInfo С INotifyDataErrorInfo для проверки достоверности

    Отображение всех ошибок

    Перемещение поддерживающего кода в базовый класс

   Использование аннотаций данных в WPF

    Добавление аннотаций данных к модели

    Контроль ошибок проверки достоверности на основе аннотаций данных

   Настройка свойства ErrorTemplate

   Итоговые сведения о проверке достоверности

  Создание специальных команд

   Реализация интерфейса ICommand

   Добавление класса ChangeColorCommand

    Присоединение команды к CommandManager

    Изменение файла MainWindow.xaml.cs

    Изменение файла MainWindow.xaml

    Тестирование приложения

   Создание класса CommandBase

   Добавление класса AddCarCommand

    Изменение файла MainWindow.xaml.cs

    Изменение файла MainWindow.xaml

    Изменение класса ChangeColorCommand

   Объекты RelayCommand

    Создание базового класса RelayCommand

    Создание класса RelayCommand

    Изменение файла MainWindow.xaml.cs

    Добавление и реализация кнопки удаления записи об автомобиле

   Итоговые сведения о командах

  Перенос кода и данных в модель представления

   Перенос кода MainWindow.xaml.cs

   Обновление кода и разметки MainWindow

   Обновление разметки элементов управления

   Итоговые сведения о моделях представлений

   Обновление проекта AutoLot.Dal для MWM

  Резюме

Часть IX

Глава 29

  Краткий экскурс в прошлое

   Введение в паттерн MVC

    Модель

    Представление

    Контроллер

   ASP.NET Core и паттерн MVC

  ASP.NET Core и .NET Core

   Одна инфраструктура, много сценариев использования

  Функциональные средства ASP.NET Core из MVC/Web API

   Соглашения по конфигурации

    Соглашения об именовании

    Структура каталогов

     Папка Controllers

     Папка Views

     Папка Shared

     Папка wwwroot (нововведение в ASP.NET Core)

    Контроллеры и действия

     Класс Controller

     Класс ControllerBase

     Действия

   Привязка моделей

    Словарь ModelState

     Добавление специальных ошибок в словарь ModelState

     Неявная привязка моделей

    Явная привязка моделей

    Атрибут Bind

    Управление источниками привязки моделей в ASP.NET Core

   Проверка достоверности моделей

   Маршрутизация

    Шаблоны URL и маркеры маршрутов

     Маршрутизация и REST-службы ASP.NET Core

    Маршрутизация на основе соглашений

     Именованные маршруты

    Маршрутизация с помощью атрибутов

     Именованные маршруты

    Маршрутизация и методы HTTP

     Методы HTTP при маршрутизации в веб-приложениях (MVC)

     Маршрутизация для служб API

    Перенаправление с использованием маршрутизации

   Фильтры

    Фильтры авторизации

    Фильтры ресурсов

    Фильтры действий

    Фильтры исключений

    Фильтры результатов

  Нововведения в ASP.NET Core

   Встроенное внедрение зависимостей

   Осведомленность о среде

    Выяснение среды времени выполнения

   Конфигурация приложений

    Извлечение настроек

   Развертывание приложений ASP.NET Core

   Легковесный и модульный конвейер запросов HTTP

  Создание и конфигурирование решения

   Использование Visual Studio

    Создание решения и проектов

    Добавление проектов AutoLot.Models и AutoLot.Dal

    Добавление ссылок на проекты

    Добавление пакетов NuGet

   Использование командной строки

  Запуск приложений ASP.NET Core

   Конфигурирование настроек запуска

   Использование Visual Studio

   Использование командной строки или окна терминала Visual Studio Code

    Изменение кода во время отладки

   Использование Visual Studio Code

    Изменение кода во время отладки

   Отладка приложений ASP.NET Core

    Присоединение с помощью Visual Studio

    Присоединение с помощью Visual Studio Code

   Обновление портов AutoLot.Api

  Создание и конфигурирование экземпляра WebHost

   Файл Program.cs

   Файл Startup.cs

    Доступные службы для класса Startup

    Конструктор

    Метод ConfigureServices()

     AutoLot.Api

     Добавление строки подключения к настройкам приложения

     AutoLot.Mvc

     Добавление строки подключения к настройкам приложения

    Метод Configure()

     AutoLot.Api

     AutoLot.Mvc

   Ведение журнала

    Интерфейс IAppLogging

    Класс AppLogging

    Конфигурация ведения журнала

     Обновление настроек приложения

     Обновление Program.cs

     Обновление Startup.cs

     Обновление контроллера

   Испытание инфраструктуры ведения журнала

  Резюме

Глава 30

  Введение в REST-службы ASP.NET Core

  Создание действий контроллера с использованием служб REST

   Результаты ответов в формате JSON

   Атрибут ApiController

    Обязательность маршрутизации с помощью атрибутов

    Автоматические ответы с кодом состояния 400

    Выведение источников для привязки параметров

    Детальные сведения о проблемах для кодов состояния ошибок

  Обновление настроек Swagger/OpenAPI

   Обновление обращений к Swagger в классе Startup

   Добавление файла XML-документации

   Добавление XML-комментариев в процесс генерации Swagger

   Дополнительные возможности документирования для конечных точек API

  Построение методов действий API

   Конструктор

   Методы GetXXX()

   Метод UpdateOne()

   Метод AddOne()

   Метод DeleteOne()

  Класс CarsController

  Оставшиеся контроллеры

  Фильтры исключений

   Создание специального фильтра исключений

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

   Тестирование фильтра исключений

  Добавление поддержки запросов между источниками

   Создание политики CORS

   Добавление политики CORS в конвейер обработки HTTP

  Резюме

Глава 31

  Введение в представления ASP.NET Core

   Экземпляры класса ViewResult и методы действий

   Механизм визуализации и синтаксис Razor

   Представления

    Каталог Views

    Каталог Shared

    Каталог DisplayTemplates

    Шаблон отображения DateTime

    Шаблон отображения Car

    Шаблон отображения CarWithColor

    Каталог EditorTemplates

    Шаблон редактирования Car

   Компоновки

    Указание стандартной компоновки для представлений

   Частичные представления

   Обновление компоновки с использованием частичных представлений

    Создание частичных представлений

     Частичное представление Head

     Частичное представление Menu

     Частичное представление JavaScriptFiles

    Отправка данных представлениям

     Строго типизированные представления и модели представлений

    Объекты ViewBag, ViewData и TempData

  Вспомогательные функции дескрипторов

   Включение вспомогательных функций дескрипторов

   Вспомогательная функция дескриптора для формы

    Форма создания для сущности Car

   Вспомогательная функция дескриптора для действия формы

   Вспомогательная функция дескриптора для якоря

   Вспомогательная функция дескриптора для элемента ввода

   Вспомогательная функция дескриптора для текстовой области

   Вспомогательная функция дескриптора для элемента выбора

   Вспомогательные функции дескрипторов для проверки достоверности

   Вспомогательная функция дескриптора для среды

   Вспомогательная функция дескриптора для ссылки

   Вспомогательная функция дескриптора для сценария

   Вспомогательная функция дескриптора для изображения

  Специальные вспомогательные функции дескрипторов

   Подготовительные шаги

    Обновление Startup.cs

    Создание расширяющего метода для типа string

   Создание базового класса

   Вспомогательная функция дескриптора для вывода сведений об элементе

   Вспомогательная функция дескриптора для удаления элемента

   Вспомогательная функция дескриптора для редактирования сведений об элементе

   Вспомогательная функция дескриптора для создания элемента

   Вспомогательная функция дескриптора для вывода списка элементов

   Обеспечение видимости специальных вспомогательных функций дескрипторов

  Вспомогательные функции HTML

   Вспомогательная функция DisplayFor()

   Вспомогательная функция DisplayForModel()

   Вспомогательные функции EditorFor() и EditorForModel()

  Управление библиотеками клиентской стороны

  Установка диспетчера библиотек как глобального инструмента .NET Core

  Добавление в проект AutoLot.Mvc библиотек клиентской стороны

   Добавление файла libman.json

    Visual Studio

    Командная строка

   Обновление файла libman.json

   Обновление ссылок на файлы JavaScript и CSS

  Завершение работы над представлениями CarsController и Cars

   Класс CarsController

   Частичное представление списка автомобилей

   Представление Index

   Представление ВуMake

   Представление Details

   Представление Create

   Методы действий Create()

    Вспомогательный метод GetMakes()

    Метод действия Create() для GET

    Метод действия Create() для POST

   Представление Edit

    Методы действий Edit()

    Метод действия Edit() для GET

    Метод действия Edit() для POST

   Представление Delete

    Методы действий Delete()

    Метод действия Delete() для GET

    Метод действия Delete() для POST

  Компоненты представлений

   Код серверной стороны

   Построение частичного представления

   Вызов компонентов представлений

   Вызов компонентов представлений как специальных вспомогательных функций дескрипторов

   Обновление меню

  Пакетирование и минификация

   Пакетирование

   Минификация

   Решение WebOptimizer

   Обновление Startup.cs

   Обновление _Viewlmports.cshtml

  Шаблон параметров в ASP.NET Core

   Добавление информации об автодилере

  Создание оболочки службы

   Обновление конфигурации приложения

   Создание класса ApiServiceSettings

   Оболочка службы API

    Интерфейс IApiServiceWrapper

    Класс ApiServiceWrapper

     Внутренние поддерживающие методы

     Вспомогательные методы для POST и PUT

     Вспомогательный метод для DELETE

     Вызовы HTTP-метода GET

     Вызов HTTP-метода POST

     Вызов HTTP-метода PUT

     Вызов HTTP-метода DELETE

    Конфигурирование служб

  Построение класса CarsController

   Вспомогательный метод GetMakes()

   Вспомогательный метод GetOneCar()

   Открытые методы действий

  Обновление компонента представления

  Совместный запуск приложений AutoLot.Mvc и AutoLot.Api

   Использование Visual Studio

   Использование командной строки

  Резюме

Загрузка...