Авторы и читатели — одна команда
Часть I. Язык программирования C# и платформа .NET 5
Часть II. Основы программирования на C#
Часть III. Объектно-ориентированное программирование на C#
Часть IV. Дополнительные конструкции программирования на C#
Часть V. Программирование с использованием сборок .NET Core
Часть VI. Работа с файлами, сериализация объектов и доступ к данным
Часть VII. Entity Framework Core
Часть IV. Дополнительные конструкции программирования на C#
Некоторые основные преимущества инфраструктуры .NET Core
Понятие жизненного цикла поддержки .NET Core
Предварительный обзор строительных блоков .NET Core (.NET Runtime, CTS и CLS)
Роль библиотек базовых классов
Основные средства в предшествующих выпусках
Сравнение управляемого и неуправляемого кода
Использование дополнительных языков программирования, ориентированных на .NET Core
Компиляция кода CIL в инструкции, специфичные для платформы
Предварительная компиляция кода CIL в инструкции, специфичные для платформы
Роль метаданных типов .NET Core
Понятие общеязыковой спецификации
Обеспечение совместимости с CLS
Различия между сборкой пространством имен и типом
Доступ к пространству имен программным образом
Исследование сборки с помощью ildasm.exe
Понятие схемы нумерации версий .NET 5
Подтверждение успешности установки .NET 5
Использование более ранних версий .NET (Core) SDK
Построение приложений .NET Core с помощью Visual Studio
Установка Visual Studio 2019 (Windows)
Использование нового диалогового окна для создания проекта и редактора кода C#
Изменение целевой инфраструктуры .NET Core
Использование функциональных средств C# 9
Использование окна Solution Explorer
Использование визуального конструктора классов
Построение приложений .NET Core с помощью Visual Studio Code
Исследование рабочей области Visual Studio Code
Восстановление пакетов, компиляция и запуск программ
Документация по .NET Core и C#
Структура простой программы C#
Использование вариаций метода Main() (обновление в версии 7.1)
Использование операторов верхнего уровня (нововведение в версии 9.0)
Указание кода ошибки приложения (обновление в версии 9.0)
Обработка аргументов командной строки
Указание аргументов командной строки в Visual Studio
Интересное отступление от темы: некоторые дополнительные члены класса System.Environment
Использование класса System.Console
Выполнение базового ввода и вывода с помощью класса Console
Форматирование консольного вывода
Форматирование числовых данных
Форматирование числовых данных за рамками консольных приложений
Работа с системными типами данных и соответствующими ключевыми словами C#
Объявление и инициализация переменных
Литерал default (нововведение в версии 7.1)
Использование внутренних типов данных и операции new (обновление в версии 9.0)
Иерархия классов для типов данных
Разбор значений из строковых данных
Использование метода TryParse() для разбора значений из строковых данных
Использование типов System.DateTime и System.TimeSpan
Работа с пространством имен System.Numerics
Использование разделителей групп цифр (нововведение в версии 7.0)
Использование двоичных литералов (нововведение в версии 7.0/7.2)
Выполнение базовых манипуляций со строками
Использование управляющих последовательностей
Определение дословных строк (обновление в версии 8.0)
Работа со строками и операциями равенства
Модификация поведения сравнения строк
Использование типа System.Text.StringBuilder
Сужающие и расширяющие преобразования типов данных
Использование ключевого слова checked
Настройка проверки переполнения на уровне проекта
Настройка проверки переполнения на уровне проекта (Visual Studio)
Использование ключевого слова unchecked
Неявно типизированные локальные переменные
Ограничения неявно типизированных переменных
Неявно типизированные данные строго типизированы
Полезность неявно типизированных локальных переменных
Работа с итерационными конструкциями C#
Использование неявной типизации в конструкциях foreach
Использование циклов while и do/while
Краткое обсуждение области видимости
Работа с конструкциями принятия решений и операциями отношения/равенства
Использование оператора if/else
Использование операций отношения и равенства
Использование операторов if/else и сопоставления с образцом (нововведение в версии 7.0)
Внесение улучшений в сопоставление с образцом (нововведение в версии 9.0)
Использование условной операции (обновление в версиях 7.2, 9.0)
Использование логических операций
Использование оператора switch
Использование выражений switch (нововведение в версии 8.0)
Синтаксис инициализации массивов 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)
Управление хранилищем, лежащим в основе перечисления
Объявление переменных типа перечисления
Использование типа System.Enum
Динамическое обнаружение пар "имя-значение" перечисления
Использование перечислений, флагов и побитовых операций
Понятие структуры (как типа значения)
Создание переменных типа структур
Использование структур, допускающих только чтение (нововведение в версии 7.2)
Использование членов, допускающих только чтение (нововведение в версии 8.0)
Использование структур ref (нововведение в версии 7.2)
Использование освобождаемых структур ref (нововведение в версии 8.0)
Типы значений и ссылочные типы
Использование типов значений ссылочных типов и операции присваивания
Использование типов значений, содержащих ссылочные типы
Передача ссылочных типов по значению
Передача ссылочных типов по ссылке
Заключительные детали относительно типов значений и ссылочных типов
Понятие типов С#, допускающих null
Использование типов значений, допускающих null
Использование ссылочных типов, допускающих null (нововведение в версии 8.0)
Включение ссылочных типов, допускающих null
Ссылочные типы, допускающие null, в действии
Работа с типами, допускающими значение null
Операция присваивания с объединением с null (нововведение в версии 8.0)
Понятие кортежей (нововведение и обновление в версии 7.0)
Использование выведенных имен переменных (обновление в версии C# 7.1)
Понятие эквивалентности/неэквивалентности кортежей (нововведение в версии 7.3)
Использование отбрасывания с кортежами
Использование отбрасывания с кортежами
Использование выражений switch с сопоставлением с образцом для кортежей (нововведение в версии 8.0)
Деконструирование кортежей с позиционным сопоставлением с образцом (нововведение в версии 8.0)
Размещение объектов с помощью ключевого слова new
Роль стандартного конструктора
Определение специальных конструкторов
Конструкторы в виде членов, сжатых до выражений (нововведение в версии 7.0)
Конструкторы с параметрами out (нововведение в версии 7.3)
Еще раз о стандартном конструкторе
Построение цепочки вызовов конструкторов с использованием this
Исследование потока управления конструкторов
Еще раз о необязательных аргументах
Понятие ключевого слова static
Определение статических полей данных
Определение статических методов
Определение статических конструкторов
Определение статических классов
Импортирование статических членов с применением ключевого слова using языка C#
Основные принципы объектно-ориентированного программирования
Модификаторы доступа C# (обновление в версии 7.2)
Использование стандартных модификаторов доступа
Использование модификаторов доступа и вложенных типов
Первый принцип объектно-ориентированного программирования: службы инкапсуляции C#
Инкапсуляция с использованием традиционных методов доступа и изменения
Инкапсуляция с использованием свойств
Свойства как члены, сжатые до выражений (нововведение в версии 7.0)
Использование свойств внутри определения класса
Свойства, допускающие только чтение
Свойства, допускающие только запись
Смешивание закрытых и открытых методов get/set в свойствах
Еще раз о ключевом слове static: определение статических свойств
Сопоставление с образцом и шаблоны свойств (нововведение в версии 8.0)
Понятие автоматических свойств
Взаимодействие с автоматическими свойствами
Автоматические свойства и стандартные значения
Инициализация автоматических свойств
Понятие инициализации объектов
Обзор синтаксиса инициализации объектов
Использование средства доступа только для инициализации (нововведение в версии 9.0)
Вызов специальных конструкторов с помощью синтаксиса инициализации
Инициализация данных с помощью синтаксиса инициализации
Работа с константными полями данных и полями данных, допускающими только чтение
Понятие константных полей данных
Понятие полей данных, допускающих только чтение
Понятие статических полей, допускающих только чтение
Использование записей (нововведение в версии 9.0)
Эквивалентность с типами записей
Копирование типов записей с использованием выражений with
Указание родительского класса для существующего класса
Замечание относительно множества базовых классов
Использование ключевого слова 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
Ода ошибкам, дефектам и исключениям
Роль обработки исключений .NET
Строительные блоки обработки исключений в .NET
Базовый класс System.Exception
Выражение throw (нововведение в версии 7.0)
Конфигурирование состояния исключения
Исключения уровня системы (System.SystemException)
Исключения уровня приложения (Systern.ApplicationException)
Построение специальных исключений, способ первый
Построение специальных исключений, способ второй
Построение специальных исключений, способ третий
Обработка множества исключений
Повторная генерация исключений
Отладка необработанных исключений с использованием Visual Studio
Сравнение интерфейсных типов и абстрактных базовых классов
Определение специальных интерфейсов
Обращение к членам интерфейса на уровне объектов
Получение ссылок на интерфейсы: ключевое слово as
Получение ссылок на интерфейсы: ключевое слово is (обновление в версии 7.0)
Стандартные реализации (нововведение в версии 8.0)
Статические конструкторы и члены (нововведение в версии 8.0)
Использование интерфейсов в качестве параметров
Использование интерфейсов в качестве возвращаемых значений
Автоматическая реализация интерфейсов
Проектирование иерархий интерфейсов
Иерархии интерфейсов со стандартными реализациями (нововведение в версии 8.0)
Множественное наследование с помощью интерфейсных типов
Интерфейсы IEnumerable и IEnumerator
Построение итераторных методов с использованием ключевого слова yield
Защитные конструкции с использованием локальных функций (нововведение в версии 7.0)
Построение именованного итератора
Более сложный пример клонирования
Указание множества порядков сортировки с помощью IComparer
Специальные свойства и специальные типы сортировки
Базовые сведения о времени жизни объектов
Код CIL для ключевого слова new
Установка объектных ссылок в null
Эфемерные поколения и сегменты
Принудительный запуск сборщика мусора
Построение финализируемых объектов
Переопределение метода System.Object.Finalize()
Подробности процесса финализации
Построение освобождаемых объектов
Повторное использование ключевого слова using в C#
Объявления using (нововведение в версии 8.0)
Создание финализируемых и освобождаемых типов
Формализованный шаблон освобождения
Настройка процесса создания данных Lazy<>
Побудительные причины создания классов коллекций
Пространство имен System.Collections
Иллюстративный пример: работа с ArrayList
Обзор пространства имен System.Collections.Specialized
Проблемы, присущие необобщенным коллекциям
Проблема безопасности в отношении типов
Первый взгляд на обобщенные коллекции
Роль параметров обобщенных типов
Указание параметров типа для обобщенных классов и структур
Указание параметров типа для обобщенных членов
Указание параметров типов для обобщенных интерфейсов
Пространство имен System.Collections.Generic
Синтаксис инициализации коллекций
Пространство имен System.Collections.ObjectModel
Работа с классом ObservableCollection
Создание специальных обобщенных методов
Создание специальных обобщенных структур и классов
Выражения default вида значений в обобщениях
Выражения default литерального вида (нововведение в версии 7.1)
Сопоставление с образцом в обобщениях (нововведение в версии 7.1)
Примеры использования ключевого слова where
Отсутствие ограничений операций
Индексация данных с использованием строковых значений
Перегрузка индексаторных методов
Определения индексаторов в интерфейсных типах
А как насчет операций += и -=?
Перегрузка операций эквивалентности
Финальные соображения относительно перегрузки операций
Понятие специальных преобразований типов
Повторение: числовые преобразования
Повторение: преобразования между связанными типами классов
Создание специальных процедур преобразования
Дополнительные явные преобразования для типа Square
Определение процедур неявного преобразования
Определение расширяющих методов
Импортирование расширяющих методов
Расширение типов, реализующих специфичные интерфейсы
Поддержка расширяющего метода GetEnumerator() (нововведение в версии 9.0)
Внутреннее представление анонимных типов
Реализация методов ToString() и GetHashCode()
Семантика эквивалентности анонимных типов
Анонимные типы, содержащие другие анонимные типы
Небезопасная (и безопасная) функция обмена
Доступ к полям через указатели (операция ->)
Закрепление типа посредством ключевого слова fixed
Определение типа делегата в C#
Базовые классы System.MulticastDelegate и System.Delegate
Отправка уведомлений о состоянии объекта с использованием делегатов
Удаление целей из списка вызовов делегата
Синтаксис групповых преобразований методов
Обобщенные делегаты Action<> и Func<>
Прослушивание входящих событий
Упрощение регистрации событий с использованием Visual Studio
Создание специальных аргументов событий
Обобщенный делегат EventHandler
Использование ключевого слова static с анонимными методами (нововведение в версии 9.0)
Использование отбрасывания с анонимными методами (нововведение в версии 9.0)
Обработка аргументов внутри множества операторов
Лямбда-выражения с несколькими параметрами и без параметров
Использование ключевого слова static с лямбда-выражениями (нововведение в версии 9.0)
Использование отбрасывания с лямбда-выражениями (нововведение в версии 9.0)
Модернизация примера CarEvents с использованием лямбда-выражений
Лямбда-выражения и члены, сжатые до выражений (обновление в версии 7.0)
Программные конструкции, специфичные для LINQ
Неявная типизация локальных переменных
Синтаксис инициализации объектов и коллекций
Выражения LINQ строго типизированы
Применение запросов LINQ к элементарным массивам
Решение с использованием расширяющих методов
Решение без использования LINQ
Выполнение рефлексии результирующего набора LINQ
LINQ и неявно типизированные локальные переменные
Возвращение результатов запроса LINQ
Возвращение результатов LINQ посредством немедленного выполнения
Применение запросов LINQ к объектам коллекций
Доступ к содержащимся в контейнере подобъектам
Применение запросов LINQ к необобщенным коллекциям
Фильтрация данных с использованием метода OfТуре<Т>()
Исследование операций запросов LINQ
Проецирование в новые типы данных
Проецирование в другие типы данных
Подсчет количества с использованием класса Enumerable
Изменение порядка следования элементов в результирующих наборах на противоположный
LINQ как лучшее средство построения диаграмм Венна
Внутреннее представление операторов запросов LINQ
Построение выражений запросов с применением операций запросов
Построение выражений запросов с использованием типа Enumerable и лямбда-выражений
Построение выражений запросов с использованием типа Enumerable и анонимных методов
Построение выражений запросов с использованием типа Enumerable и низкоуровневых делегатов
Взаимодействие с процессами используя платформу .NET Core
Перечисление выполняющихся процессов
Исследование конкретного процесса
Исследование набора потоков процесса
Исследование набора модулей процесса
Запуск и останов процессов программным образом
Управление запуском процесса с использованием класса ProcessStartInfo
Использование команд операционной системы с классом ProcessStartInfo
Взаимодействие со стандартным доменом приложения
Перечисление загруженных сборок
Изоляция сборок с помощью контекстов загрузки приложений
Итоговые сведения о процессах, доменах приложений и контекстах загрузки
Отношения между процессом, доменом приложения, контекстом и потоком
Сложность, связанная с параллелизмом
Пространство имен System.Threading
Получение статистических данных о текущем потоке выполнения
Ручное создание вторичных потоков
Работа с делегатом ThreadStart
Работа с делегатом ParametrizedThreadStart
Потоки переднего плана и фоновые потоки
Синхронизация с использованием ключевого слова lock языка C#
Синхронизация с использованием типа System.Threading.Monitor
Синхронизация с использованием типа System.Threading.Interlocked
Программирование с использованием обратных вызовов Timer
Использование автономного отбрасывания (нововведение в версии 7.0)
Параллельное программирование с использованием TPL
Пространство имен System.Threading.Tasks
Обеспечение параллелизма данных с помощью класса Parallel
Доступ к элементам пользовательского интерфейса во вторичных потоках
Обеспечение параллелизма задач с помощью класса Parallel
Асинхронные вызовы с помощью async/await
Знакомство с ключевыми словами async и await языка C# (обновление в версиях 7.1, 9.0)
Класс SynchronizationContext и async/await
Соглашения об именовании асинхронных методов
Асинхронные методы, возвращающие void
Асинхронные методы, возвращающие void и поддерживающие await
Асинхронные методы, возвращающие void и работающие в стиле "запустил и забыл"
Асинхронные методы с множеством контекстов await
Вызов асинхронных методов из неасинхронных методов
Ожидание с помощью await в блоках catch и finally
Обобщенные возвращаемые типы в асинхронных методах (нововведение в версии 7.0)
Локальные функции (нововведение в версии 7.0)
Асинхронные потоки (нововведение в версии 8.0)
Итоговые сведения о ключевых словах async и await
Определение специальных пространств имен
Разрешение конфликтов имен с помощью полностью заданных имен
Разрешение конфликтов имен с помощью псевдонимов
Создание вложенных пространств имен
Изменение стандартного пространства имен в Visual Studio
Сборки содействуют многократному использованию кода
Сборки устанавливают границы типов
Сборки являются единицами, поддерживающими версии
Сборки являются самоописательными
Установка инструментов профилирования C++
Заголовок файла операционной системы (Windows)
Код CIL, метаданные типов и манифест сборки
Отличия между библиотеками классов и консольными приложениями
Отличия между библиотеками классов .NET Standard и .NET Core
Построение и потребление библиотеки классов .NET Core
Построение клиентского приложения C#
Построение клиентского приложения Visual Basic
Межъязыковое наследование в действии
Открытие доступа к внутренним типам для других сборок
Использование атрибута assembly
Пакетирование сборок с помощью NuGet
Опубликование консольных приложений (обновление в версии .NET 5)
Опубликование приложений, зависящих от инфраструктуры
Опубликование автономных приложений
Опубликование автономных приложений в виде единственного файла
Определение местонахождения сборок исполняющей средой .NET Core
Потребность в метаданных типов
Просмотр (частичных) метаданных для перечисления EngineStateEnum
Просмотр (частичных) метаданных для типа Car
Документирование определяемой сборки
Документирование ссылаемых сборок
Документирование строковых литералов
Получение информации о типе с помощью System.Object.GetType()
Получение информации о типе с помощью typeof()
Получение информации о типе с помощью System.Туре.GetType()
Построение специального средства для просмотра метаданных
Рефлексия реализованных интерфейсов
Отображение разнообразных дополнительных деталей
Добавление операторов верхнего уровня
Рефлексия параметров и возвращаемых значений методов
Рефлексия сборок инфраструктуры
Сокращенная система обозначения атрибутов C#
Указание параметров конструктора для атрибутов
Построение специальных атрибутов
Применение специальных атрибутов
Ограничение использования атрибутов
Использование файла проекта для атрибутов сборки
Рефлексия атрибутов с использованием раннего связывания
Рефлексия атрибутов с использованием позднего связывания
Практическое использование рефлексии позднего связывания и специальных атрибутов
Построение расширяемого приложения
Построение мультипроектного решения ExtendableApp
Создание решения и проектов с помощью интерфейса командной строки
Добавление событий PostBuild в файлы проектов
Создание решения и проектов с помощью Visual Studio
Установка зависимостей проектов при компиляции
Построение сборки CommonSnappableTypes.dll
Построение оснастки на Visual Basic
Добавление кода для ExtendableApp
Роль ключевого слова dynamic языка C#
Вызов членов на динамически объявленных данных
Область использования ключевого слова dynamic
Ограничения ключевого слова dynamic
Практическое использование ключевого слова dynamic
Роль исполняющей среды динамического языка
Динамический поиск в деревьях выражений во время выполнения
Упрощение вызовов с поздним связыванием посредством динамических типов
Использование ключевого слова dynamic для передачи аргументов
Упрощение взаимодействия с СОМ посредством динамических данных (только Windows)
Роль основных сборок взаимодействия
Встраивание метаданных взаимодействия
Общие сложности взаимодействия с СОМ
Взаимодействие с СОМ с использованием динамических данных C#
Причины для изучения грамматики языка CIL
Директивы, атрибуты и коды операций CIL
Разница между кодами операций и их мнемоническими эквивалентами в СIL
Заталкивание и выталкивание: основанная на стеке природа CIL
Взаимодействие c CIL: модификация файла *.il
Указание ссылок на внешние сборки в CIL
Определение текущей сборки в CIL
Определение пространств имен в CIL
Определение типов классов в CIL
Определение и реализация интерфейсов в CIL
Определение перечислений в CIL
Соответствия между типами данных в библиотеке базовых классов .NET Core, C# и CIL
Определение членов типов в CIL
Определение полей данных в CIL
Определение конструкторов типа в CIL
Исследование кодов операций CIL
Объявление локальных переменных в CIL
Отображение параметров на локальные переменные в CIL
Представление итерационных конструкций в CIL
Заключительные слова о языке CIL
Исследование пространства имен System.Reflection.Emit
Роль типа System.Reflection.Emit.ILGenerator
Выпуск сборки и набора модулей
Выпуск типа HelloClass и строковой переменной-члена
Использование динамически сгенерированной сборки
Исследование пространства имен System.IO
Классы Directory(Directorylnfо) и File(FileInfo)
Абстрактный базовый класс FileSystemInfo
Перечисление файлов с помощью типа DirectoryInfо
Создание подкаталогов с помощью типа DirectoryInfo
Методы FileInfо.OpenRead() и FileInfо.OpenWrite()
Методы FileInfo.CreateText() и FileInfo.AppendText()
Дополнительные члены типа File
Работа с типами StreamWriter и StreamReader
Прямое создание объектов типа StreamWriter/StreamReader
Работа с типами StringWriter и StringReader
Работа с типами BinaryWriter и BinaryReader
Программное слежение за файлами
Создание примеров типов и написание операторов верхнего уровня
Сериализация и десериализация с помощью XmlSerializer
Управление генерацией данных XML
Сериализация объектов с использованием XmlSerializer
Сериализация коллекций объектов
Десериализация объектов и коллекций объектов
Сериализация и десериализация с помощью System.Text.Json
Управление генерацией данных JSON
Сериализация объектов с использованием JsonSerializer
Понятный для человека вывод данных JSON
Именование элементов JSON в стиле Pascal или в "верблюжьем" стиле
Обработка чисел с помощью JsonSerializer
Потенциальные проблемы, связанные с производительностью, при использовании JsonSerializerOption
Стандартные настройки свойств JsonSerializer для веб-приложений
Сериализация коллекций объектов
Десериализация объектов и коллекций объектов
Типы из пространства имен System.Data
Роль интерфейса IDbTransaction
Роль интерфейсов IDbDataParameter и IDataParameter
Роль интерфейсов IDbDataAdapter и IDataAdapter
Роль интерфейсов IDataReader и IDataRecord
Абстрагирование поставщиков данных с использованием интерфейсов
Установка SQL Server и Azure Data Studio
Установка SQL Server в контейнер Docker
Получение образа и запуск SQL Server 2019
Установка IDE-среды SQL Server
Подключение к SQL Server в контейнере Docker
Подключение к SQL Server LocalDb
Подключение к любому другому экземпляру SQL Server
Восстановление базы данных AutoLot из резервной копии
Копирование файла резервной копии в имеющийся контейнер
Восстановление базы данных с помощью SSMS
Восстановление базы данных в экземпляр SQL Server (Docker)
Восстановление базы данных в экземпляр SQL Server (Windows)
Восстановление базы данных с помощью Azure Data Studio
Создание отношений между таблицами
Создание отношения между таблицами Inventory и Makes
Создание отношения между таблицами Inventory и Orders
Создание отношения между таблицами Orders и Customers
Создание отношения между таблицами Customers и CreditRisks
Создание хранимой процедуры GetPetName
Добавление тестовых записей в таблицу Customers
Добавление тестовых записей в таблицу Orders
Добавление тестовых записей в таблицу CreditRisks
Модель фабрики поставщиков данных ADO.NET
Полный пример фабрики поставщиков данных
Потенциальный недостаток модели фабрики поставщиков данных
Погружение в детали объектов подключений, команд и чтения данных
Работа с объектами подключений
Работа с объектами ConnectionStringBuilder
Работа с объектами чтения данных
Получение множества результирующих наборов с использованием объекта чтения данных
Работа с запросами создания обновления и удаления
Создание классов Car и CarViewModel
Добавление класса InventoryDal
Открытие и закрытие подключения
Добавление реализации IDisposable
Вставка новой записи об автомобиле
Создание строго типизированного метода InsertCar()
Работа с параметризированным и объектами команд
Указание параметров с использованием типа DbParameter
Обновление метода UpdateCarPetName()
Обновление метода InsertAuto()
Создание консольного клиентского приложения
Понятие транзакций базы данных
Основные члены объекта транзакции ADO.NET
Добавление метода транзакции в inventoryDal
Тестирование транзакции базы данных
Выполнение массового копирования с помощью ADO.NET
Исследование класса SqlBulkCopy
Создание специального класса чтения данных
Выполнение массового копирования
Тестирование массового копирования
Инструменты объектно-реляционного отображения
Строительные блоки Entity Framework Core
Создание класса, производного от DbContext
Конфигурирование экземпляра DbContext
Фабрика DbContext этапа проектирования
Поддержка транзакций и точек сохранения
Транзакции и стратегии выполнения
События SavingChanges/SavedChanges
Гибкое сопоставление с запросом или таблицей
Сопоставление свойств со столбцами
Сопоставление классов с таблицами
Сопоставление "таблица на иерархию" (ТРН)
Сопоставление "таблица на тип" (ТРТ)
Навигационные свойства и внешние ключи
Отсутствие свойств для внешних ключей
Отношения "многие ко многим" (нововведение в версии EF Core 5)
Соглашения, связанные с сущностями
Отображение свойств на столбцы
Аннотации данных Entity Framework
Аннотации и навигационные свойства
Соглашения, аннотации данных и Fluent API — что выбрать?
Смешанное выполнение на клиентской и серверной сторонах
Сравнение отслеживаемых и неотслеживаемых запросов
Важные функциональные средства EF Core
Обработка значений, генерируемых базой данных
Фильтрованные включаемые данные
Энергичная загрузка с разделением запросов
Глобальные фильтры запросов на навигационных свойствах
Явная загрузка с глобальными фильтрами запросов
Выполнение низкоуровневых запросов SQL с помощью LINQ
Сопоставление с функциями базы данных
Команды CLI глобального инструмента EF Core
Команды для управления миграциями
Команды для управления базой данных
Команды для управления типами DbContext
"Сначала код" или "сначала база данных"
Создание проектов AutoLot.Dal и AutoLot.Models
Создание шаблонов для класса, производного от DbContext, и сущностных классов
Переключение на подход "сначала код"
Создание фабрики экземпляров класса, производного от DbContext, на этапе проектирования
Принадлежащий сущностный класс Person
Переопределение метода SaveChanges()
Обработка событий DbContext и ChangeTracker
Создание миграции и обновление базы данных
Добавление представления базы данных и хранимой процедуры
Добавление класса MigrationHelpers
Обновление и применение миграции
Добавление модели представления
Добавление класса модели представления
Добавление класса модели представления к ApplicationDbContext
Добавление базового интерфейса IRepo
Реализация метода SaveChanges()
Реализация общих методов чтения
Реализация методов добавления, обновления и удаления
Интерфейсы хранилищ, специфичных для сущностей
Интерфейс хранилища данных об автомобилях
Интерфейс хранилища данных о кредитных рисках
Интерфейс хранилища данных о заказчиках
Интерфейс хранилища данных о производителях
Интерфейс хранилища данных о заказах
Реализация классов хранилищ, специфичных для сущностей
Хранилище данных об автомобилях
Хранилище данных о кредитных рисках
Хранилище данных о производителях
Программная работа с базой данных и миграциями
Удаление, создание и очистка базы данных
Добавление вспомогательных методов для выполнения тестов в транзакциях
Добавление класса тестовой оснастки EnsureAutoLotDatabase
Добавление классов интеграционных тестов
Тестовые методы [Fact] и [Theory]
Сортировка записей в обратном порядке
Использование First()/FirstOrDefault()
Использование Last()/LastOrDefault()
Использование Single()/SingleOrDefault()
Отключение глобальных фильтров запросов
Фильтры запросов для навигационных свойств
Энергичная загрузка связанных данных
Разделение запросов к связанным данным
Явная загрузка связанных данных
Явная загрузка связанных данных с фильтрами запросов
Выполнение запросов SQL с помощью LINQ
Получение данных из хранимых процедур
Добавление одной записи с использованием метода Attach()
Добавление нескольких записей одновременно
Соображения относительно столбца идентичности при добавлении записей
Обновление отслеживаемых сущностей
Обновление неотслеживаемых сущностей
Удаление отслеживаемых сущностей
Удаление неотслеживаемых сущностей
Перехват отказов каскадного удаления
Побудительные причины создания WPF
Унификация несходных API-интерфейсов
Обеспечение разделения обязанностей через XAML
Обеспечение оптимизированной модели визуализации
Упрощение программирования сложных пользовательских интерфейсов
Перечисление элементов коллекции Windows
Роль класса 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
Пространства имен XML и "ключевые слова" XAML
Управление видимостью классов и переменных-членов
Элементы XAML, атрибуты XAML и преобразователи типов
Понятие синтаксиса "свойство-элемент" в XAML
Понятие присоединяемых свойств XAML
Понятие расширений разметки XAML
Построение приложений WPF с использованием Visual Studio
Панель инструментов и визуальный конструктор/редактор XAML
Установка свойств с использованием окна Properties
Обработка событий с использованием окна Properties
Обработка событий в редакторе XAML
Включение и отключение отладчика XAML
Отображение разметки XAML окна на код C#
Взаимодействие с данными уровня приложения
Обработка закрытия объекта Window
Обзор основных элементов управления WPF
Элементы управления для работы с Ink API
Элементы управления для работы с документами WPF
Краткий обзор визуального конструктора WPF в Visual Studio
Работа с элементами управления WPF в Visual Studio
Работа с окном Document Outline
Управление компоновкой содержимого с использованием панелей
Позиционирование содержимого внутри панелей Canvas
Позиционирование содержимого внутри панелей WrapPanel
Позиционирование содержимого внутри панелей StackPanel
Позиционирование содержимого внутри панелей Grid
Установка размеров столбцов и строк в панели Grid
Панели Grid с типами GridSplitter
Позиционирование содержимого внутри панелей DockPanel
Включение прокрутки в типах панелей
Конфигурирование панелей с использованием визуальных конструкторов Visual Studio
Построение окна с использованием вложенных панелей
Построение панели инструментов
Завершение проектирования пользовательского интерфейса
Реализация обработчиков событий MouseEnter/MouseLeave
Реализация логики проверки правописания
Подключение команд к свойству Command
Подключение команд к произвольным действиям
Работа с командами Open и Save
Понятие маршрутизируемых событий
Роль пузырьковых маршрутизируемых событий
Продолжение или прекращение пузырькового распространения
Роль туннельных маршрутизируемых событий
Более глубокое исследование API-интерфейсов и элементов управления WPF
Работа с элементом управления TabControl
Проектирование панели инструментов
Элемент управления RadioButton
Добавление кнопок сохранения, загрузки и удаления
Добавление элемента управления InkCanvas
Обработка событий для вкладки Ink API
Добавление элементов управления в панель инструментов
Сохранение, загрузка и очистка данных InkCanvas
Введение в модель привязки данных WPF
Построение вкладки Data Binding
Форматирование привязанных данных
Преобразование данных с использованием интерфейса IValueConverter
Установление привязок данных в коде
Исследование существующего свойства зависимости
Важные замечания относительно оболочек свойств CLR
Построение специального свойства зависимости
Добавление процедуры проверки достоверности данных
Реагирование на изменение свойства
Понятие служб визуализации графики WPF
Варианты графической визуализации WPF
Визуализация графических данных с использованием фигур
Добавление прямоугольников, эллипсов и линий на поверхность Canvas
Удаление прямоугольников, эллипсов и линий с поверхности Canvas
Работа с элементами Polyline и Polygon
"Мини-язык" моделирования путей
Конфигурирование кистей с использованием Visual Studio
Конфигурирование кистей в коде
Применение графических трансформаций
Первый взгляд на трансформации
Работа с редактором трансформаций Visual Studio
Построение начальной компоновки
Применение трансформаций на этапе проектирования
Визуализация графических данных с использованием рисунков и геометрических объектов
Построение кисти DrawingBrush с использованием геометрических объектов
Рисование с помощью DrawingBrush
Включение типов Drawing в DrawingImage
Работа с векторными изображениями
Преобразование файла с векторной графикой в файл XAML
Импортирование графических данных в проект WPF
Визуализация графических данных с использованием визуального уровня
Базовый класс Visual и производные дочерние классы
Первый взгляд на класс DrawingVisual
Визуализация графических данных в специальном диспетчере компоновки
Реагирование на операции проверки попадания
Включение в проект несвязанных файлов ресурсов
Конфигурирование несвязанных ресурсов
Программная загрузка изображения
Встраивание ресурсов приложения
Работа с объектными (логическими) ресурсами
Определение ресурсов уровня окна
Расширение разметки {StaticResource}
Расширение разметки {DynamicResource}
Определение объединенных словарей ресурсов
Определение сборки, включающей только ресурсы
Запуск в обратном порядке и циклическое выполнение анимации
Реализация анимации в разметке XAML
Анимация с использованием дискретных ключевых кадров
Определение и применение стиля
Переопределение настроек стиля
Влияние атрибута TargetType на стили
Создание подклассов существующих стилей
Определение стилей с триггерами
Определение стилей с множеством триггеров
Логические деревья, визуальные деревья и стандартные шаблоны
Программное инспектирование логического дерева
Программное инспектирование визуального дерева
Программное инспектирование стандартного шаблона элемента управления
Построение шаблона элемента управления с помощью инфраструктуры триггеров
Встраивание визуальных подсказок с использованием триггеров
Роль расширения разметки {TemplateBinding}
Анемичные модели или анемичные модели представлений
Система уведомлений привязки WPF
Наблюдаемые модели и коллекции
Изменение данных об автомобиле в коде
Использование класса ObservableCollection
Обновление источника через взаимодействие с пользовательским интерфейсом
Итоговые сведения об уведомлениях и наблюдаемых моделях
Модификация примера для демонстрации проверки достоверности
Варианты проверки достоверности
Интерфейс INotifyDataErrorInfo
Реализация поддерживающего кода
Использование интерфейса INotifyDataErrorInfo для проверки достоверности
Комбинирование IDataErrorInfo С INotifyDataErrorInfo для проверки достоверности
Перемещение поддерживающего кода в базовый класс
Использование аннотаций данных в WPF
Добавление аннотаций данных к модели
Контроль ошибок проверки достоверности на основе аннотаций данных
Настройка свойства ErrorTemplate
Итоговые сведения о проверке достоверности
Реализация интерфейса ICommand
Добавление класса ChangeColorCommand
Присоединение команды к CommandManager
Изменение файла MainWindow.xaml.cs
Изменение файла MainWindow.xaml
Добавление класса AddCarCommand
Изменение файла MainWindow.xaml.cs
Изменение файла MainWindow.xaml
Изменение класса ChangeColorCommand
Создание базового класса RelayCommand
Изменение файла MainWindow.xaml.cs
Добавление и реализация кнопки удаления записи об автомобиле
Перенос кода и данных в модель представления
Перенос кода MainWindow.xaml.cs
Обновление кода и разметки MainWindow
Обновление разметки элементов управления
Итоговые сведения о моделях представлений
Обновление проекта AutoLot.Dal для MWM
Одна инфраструктура, много сценариев использования
Функциональные средства ASP.NET Core из MVC/Web API
Папка wwwroot (нововведение в ASP.NET Core)
Добавление специальных ошибок в словарь ModelState
Управление источниками привязки моделей в ASP.NET Core
Проверка достоверности моделей
Шаблоны URL и маркеры маршрутов
Маршрутизация и REST-службы ASP.NET Core
Маршрутизация на основе соглашений
Маршрутизация с помощью атрибутов
Методы HTTP при маршрутизации в веб-приложениях (MVC)
Перенаправление с использованием маршрутизации
Встроенное внедрение зависимостей
Выяснение среды времени выполнения
Развертывание приложений ASP.NET Core
Легковесный и модульный конвейер запросов HTTP
Создание и конфигурирование решения
Добавление проектов AutoLot.Models и AutoLot.Dal
Использование командной строки
Запуск приложений ASP.NET Core
Конфигурирование настроек запуска
Использование командной строки или окна терминала Visual Studio Code
Изменение кода во время отладки
Использование Visual Studio Code
Изменение кода во время отладки
Отладка приложений ASP.NET Core
Присоединение с помощью Visual Studio
Присоединение с помощью Visual Studio Code
Создание и конфигурирование экземпляра WebHost
Доступные службы для класса Startup
Добавление строки подключения к настройкам приложения
Добавление строки подключения к настройкам приложения
Обновление настроек приложения
Испытание инфраструктуры ведения журнала
Введение в REST-службы ASP.NET Core
Создание действий контроллера с использованием служб REST
Результаты ответов в формате JSON
Обязательность маршрутизации с помощью атрибутов
Автоматические ответы с кодом состояния 400
Выведение источников для привязки параметров
Детальные сведения о проблемах для кодов состояния ошибок
Обновление настроек Swagger/OpenAPI
Обновление обращений к Swagger в классе Startup
Добавление файла XML-документации
Добавление XML-комментариев в процесс генерации Swagger
Дополнительные возможности документирования для конечных точек API
Построение методов действий API
Создание специального фильтра исключений
Добавление фильтров в конвейер обработки
Тестирование фильтра исключений
Добавление поддержки запросов между источниками
Добавление политики CORS в конвейер обработки HTTP
Введение в представления ASP.NET Core
Экземпляры класса ViewResult и методы действий
Механизм визуализации и синтаксис Razor
Шаблон отображения CarWithColor
Указание стандартной компоновки для представлений
Обновление компоновки с использованием частичных представлений
Создание частичных представлений
Частичное представление JavaScriptFiles
Отправка данных представлениям
Строго типизированные представления и модели представлений
Объекты ViewBag, ViewData и TempData
Вспомогательные функции дескрипторов
Включение вспомогательных функций дескрипторов
Вспомогательная функция дескриптора для формы
Форма создания для сущности Car
Вспомогательная функция дескриптора для действия формы
Вспомогательная функция дескриптора для якоря
Вспомогательная функция дескриптора для элемента ввода
Вспомогательная функция дескриптора для текстовой области
Вспомогательная функция дескриптора для элемента выбора
Вспомогательные функции дескрипторов для проверки достоверности
Вспомогательная функция дескриптора для среды
Вспомогательная функция дескриптора для ссылки
Вспомогательная функция дескриптора для сценария
Вспомогательная функция дескриптора для изображения
Специальные вспомогательные функции дескрипторов
Создание расширяющего метода для типа string
Вспомогательная функция дескриптора для вывода сведений об элементе
Вспомогательная функция дескриптора для удаления элемента
Вспомогательная функция дескриптора для редактирования сведений об элементе
Вспомогательная функция дескриптора для создания элемента
Вспомогательная функция дескриптора для вывода списка элементов
Обеспечение видимости специальных вспомогательных функций дескрипторов
Вспомогательная функция DisplayFor()
Вспомогательная функция DisplayForModel()
Вспомогательные функции EditorFor() и EditorForModel()
Управление библиотеками клиентской стороны
Установка диспетчера библиотек как глобального инструмента .NET Core
Добавление в проект AutoLot.Mvc библиотек клиентской стороны
Обновление ссылок на файлы JavaScript и CSS
Завершение работы над представлениями CarsController и Cars
Частичное представление списка автомобилей
Вспомогательный метод GetMakes()
Метод действия Create() для GET
Метод действия Create() для POST
Метод действия Edit() для POST
Метод действия Delete() для GET
Метод действия Delete() для POST
Построение частичного представления
Вызов компонентов представлений
Вызов компонентов представлений как специальных вспомогательных функций дескрипторов
Обновление _Viewlmports.cshtml
Шаблон параметров в ASP.NET Core
Добавление информации об автодилере
Обновление конфигурации приложения
Создание класса ApiServiceSettings
Внутренние поддерживающие методы
Вспомогательные методы для POST и PUT
Вспомогательный метод для DELETE
Построение класса CarsController
Вспомогательный метод GetMakes()
Вспомогательный метод GetOneCar()
Обновление компонента представления
Совместный запуск приложений AutoLot.Mvc и AutoLot.Api