C# и платформа .NET
Все объяснения, задачи и лабораторная в одном месте.
Можно сохранить страницу в PDF через печать браузера. Для печати разборы ответов раскрываются автоматически.
1. Типы C#, LINQ и pattern matching
Объяснение
C# различает value и reference types. LINQ часто откладывает выполнение до перечисления. Nullable annotations помогают анализатору, но не проверяют автоматически данные, пришедшие из сети.
Задача для самостоятельного решения
Почему два перечисления LINQ-запроса могут дать разные результаты?
Показать разбор ответа
Запрос выполняется заново и видит изменившийся источник. Если нужен стабильный снимок, материализуйте его через ToList и учитывайте стоимость памяти.
2. CLR, память и async/await
Объяснение
async/await освобождает поток во время ожидания асинхронного ввода-вывода. Это не означает запуска вычисления на другом CPU. CancellationToken передаёт просьбу об отмене, которую операция должна обработать.
Задача для самостоятельного решения
Ускорит ли async тяжёлое вычисление без await?
Показать разбор ответа
Нет. Оно продолжит занимать поток. Для CPU-задачи нужна иная организация исполнения; async полезен прежде всего при ожидании сети, файла или БД.
3. Проектирование библиотек и DI
Объяснение
DI-контейнер управляет созданием и временем жизни зависимостей. Scoped-сервис живёт в области запроса, singleton — дольше. Долгоживущий сервис не должен случайно удерживать объект более короткого времени жизни.
Задача для самостоятельного решения
Почему DbContext обычно не сохраняют в singleton?
Показать разбор ответа
Он не предназначен для конкурентной работы нескольких запросов и содержит изменяемое состояние отслеживания. Создавайте корректную область или фабрику контекстов.
4. ASP.NET Core pipeline и API
Объяснение
Middleware образуют цепочку обработки запроса. Порядок важен: обработчик ошибок должен оборачивать операции, чьи исключения он ловит. Аутентификация устанавливает личность, авторизация проверяет разрешение.
Задача для самостоятельного решения
Где проверять право пользователя читать конкретный заказ?
Показать разбор ответа
После определения пользователя и загрузки контекста заказа, до выдачи данных. Одного признака «пользователь вошёл» недостаточно для объектной авторизации.
5. EF Core, транзакции и миграции
Объяснение
EF Core переводит выражения в SQL и отслеживает сущности. Транзакции защищают согласованность, а optimistic concurrency обнаруживает конфликт версии. Миграция схемы — отдельный управляемый шаг релиза.
Задача для самостоятельного решения
Два пользователя редактируют одну строку. Как не потерять первое изменение?
Показать разбор ответа
Проверять concurrency token при UPDATE. Если версия изменилась, вернуть конфликт и предложить слияние или повтор, а не молча перезаписывать данные.
6. Тесты, логирование и публикация
Объяснение
Логи должны содержать идентификатор запроса и структурированные поля. Unit-тест изолирует вычисление, интеграционный проверяет компоненты вместе. Health endpoint должен различать живой процесс и готовность обслуживать трафик.
Задача для самостоятельного решения
БД временно недоступна. Нужно ли убивать процесс по liveness?
Показать разбор ответа
Обычно нет: liveness проверяет невосстановимое зависание приложения, readiness исключает его из балансировки. Перезапуски при внешнем сбое могут усилить аварию.
Лабораторная работа
Подготовка
.NET SDK, новый console project. Поместите пример в Program.cs и выполните dotnet run.
Учебный пример
var prices = new[] {100m, 200m, 50m};
var total = prices.Where(x => x >= 100m).Sum();
Console.WriteLine(total);
if (total != 300m) throw new Exception("Неверная сумма");Как работает пример и что ожидать
Вывод 300. Суффикс m создаёт decimal, LINQ фильтрует до суммирования. Материализация не нужна для одного прохода по уже имеющемуся массиву. Для сетевого ввода потребуются проверка схемы и диапазона.
Итоговая работа
Создайте ASP.NET Core API с EF Core, scoped DbContext и optimistic concurrency. Напишите интеграционный тест двух конкурентных обновлений, проверьте 401/403 и отмену зависшего запроса.
Проверка результата
1. Опишите исходные данные и условия запуска, чтобы другой человек мог повторить работу.
2. Приложите результат обычного сценария и сравните его с ожидаемым.
3. Проверьте неверный вход, граничный случай и отказ зависимости, если она есть.
4. Объясните выбранное решение и известное ограничение.
5. Сохраните исправления после самопроверки вместе с примером, который раньше не работал.
Как оценить работу
По каждому пункту поставьте 0 (не выполнено), 1 (выполнено с пробелами) или 2 (результат воспроизводим и объяснён). Если обязательный сценарий не работает, вернитесь к нему независимо от общей суммы. Это рубрика самопроверки: сайт не исполняет присланный код и не выдаёт автоматическую оценку проекта.