Saltar al contenido
L-SYSTEM

recomendadointermedio

C# 14 и .NET 10: от поверхностного знания к рабочему (Extended)

Курс для программистов, которые C# «в целом знают», но на код-ревью и на собеседовании проваливаются на вопросах «почему так, а не иначе». Язык разбирается не как список конструкций, а как набор решений с ценой: значимые и ссылочные типы, память и сборщик мусора, равенство, null, сопоставление с образцом, строки и Span, обобщения, коллекции, LINQ, исключения, async и конкурентность, данные на границе процесса, рефлексия и генераторы кода. Затем пять юнитов на SOLID — каждый принцип как ответ на конкретную боль, а не как лозунг. Затем паттерны проектирования — порождающие, структурные, поведенческие и прикладные паттерны .NET — с обязательным разбором, когда паттерн вредит. Финал — тестируемость, разговор об архитектуре вслух и обзор нового в C# 13 и 14. Необязательная ветка «C# в приложении» доводит язык до работающего сервиса: хост и DI, Minimal API, HttpClient и фоновые задачи, EF Core, тесты, выпуск в Azure. Все примеры — в одной системе, бэкенде ENGAGE вымышленной компании Aldervane. C# 14 / .NET 10 LTS.

Tu lección es en tu idioma: la dirige tu asistente.

  • Material: ruso
  • Examen: ruso; se hace en el sitio, sin traducir
Cómo funciona

Tu asistente toma el material del curso de nuestro servidor y dirige la lección en tu idioma.

El examen se hace en el sitio, sin asistente. Las preguntas del examen no se traducen: así se ha decidido para todos los cursos.

Cómo conectar un asistente

Recorrido por el curso

· 38 unidades

orden libre · los niveles de abajo son el orden que sugiere el autor, no una condiciónVista: mapa · niveles

  1. Nivel 1

    ~2 h

  2. Nivel 2

    ~2 h

  3. Nivel 3

    ~5,5 h

    según el diseño del autor, después de «Значимые и ссылочные типы: стек, куча и упаковка»

  4. Nivel 4

    ~7,5 h

  5. Nivel 5

    ~8 h

  6. Nivel 6

    ~4 h

  7. Nivel 7

    ~8 h

  8. Nivel 8

    ~6 h

  9. Nivel 9

    ~4 h

  10. Nivel 10

    ~1,5 h

  11. Nivel 11

    ~2,5 h

  12. Nivel 12

    ~8 h

  13. Nivel 13

    ~8 h

  14. Nivel 14

    ~4,5 h

  15. Nivel 15

    ~4 h

  16. Examen

    cerrada · inscríbete en el curso

    • final · en el navegador, sin el asistente

      Examen

El recorrido en palabras
  • Nivel 1 · Что на самом деле происходит, когда вы жмёте F5 — ~2 h
  • Nivel 2 · Значимые и ссылочные типы: стек, куча и упаковка — según el diseño del autor, después de «Что на самом деле происходит, когда вы жмёте F5»; ~2 h
  • Nivel 3 · Память и время жизни: сборщик мусора, IDisposable, using — según el diseño del autor, después de «Значимые и ссылочные типы: стек, куча и упаковка»; ~2 h
  • Nivel 3 · class, struct, record: чем объявлять данные — según el diseño del autor, después de «Значимые и ссылочные типы: стек, куча и упаковка»; ~2 h
  • Nivel 3 · Строки: неизменяемость, интернирование, StringBuilder, Span — según el diseño del autor, después de «Значимые и ссылочные типы: стек, куча и упаковка»; ~1,5 h
  • Nivel 4 · Равенство, хеш и сравнение: контракт, который легко нарушить — según el diseño del autor, después de «class, struct, record: чем объявлять данные»; ~2 h
  • Nivel 4 · null: nullable-типы, ссылочная нулевая аннотация и что с этим делать — según el diseño del autor, después de «class, struct, record: чем объявлять данные»; ~1,5 h
  • Nivel 4 · Span, Memory, ref struct и как мерить — según el diseño del autor, después de cualquiera de estas: «Значимые и ссылочные типы: стек, куча и упаковка», «Строки: неизменяемость, интернирование, StringBuilder, Span»; ~2 h
  • Nivel 4 · Инкапсуляция и конструирование: объект, который нельзя собрать неправильно — según el diseño del autor, después de «class, struct, record: чем объявлять данные»; ~2 h
  • Nivel 5 · Сопоставление с образцом, кортежи, деконструкция — según el diseño del autor, después de cualquiera de estas: «class, struct, record: чем объявлять данные», «null: nullable-типы, ссылочная нулевая аннотация и что с этим делать»; ~2 h
  • Nivel 5 · Наследование и полиморфизм: virtual, override, new, sealed — según el diseño del autor, después de «Инкапсуляция и конструирование: объект, который нельзя собрать неправильно»; ~2 h
  • Nivel 5 · Делегаты, лямбды, замыкания, события — según el diseño del autor, después de «Инкапсуляция и конструирование: объект, который нельзя собрать неправильно»; ~2 h
  • Nivel 5 · Исключения: чем они являются и чем не являются — según el diseño del autor, después de «Инкапсуляция и конструирование: объект, который нельзя собрать неправильно»; ~2 h
  • Nivel 6 · Интерфейсы: контракт, явная реализация, DIM — según el diseño del autor, después de «Наследование и полиморфизм: virtual, override, new, sealed»; ~1,5 h
  • Nivel 6 · async/await: что это и чего это не — según el diseño del autor, después de «Делегаты, лямбды, замыкания, события»; ~2,5 h
  • Nivel 7 · Обобщения: ограничения, реификация, вариантность — según el diseño del autor, después de «Интерфейсы: контракт, явная реализация, DIM»; ~2 h
  • Nivel 7 · Данные на границе: JSON, файлы и потоки, даты и время — según el diseño del autor, después de cualquiera de estas: «Исключения: чем они являются и чем не являются», «async/await: что это и чего это не»; ~2 h
  • Nivel 7 · Конкурентность: lock, Lock, Interlocked, SemaphoreSlim, Channel, Parallel — según el diseño del autor, después de «async/await: что это и чего это не»; ~2 h
  • Nivel 7 · SRP: одна причина для изменения — según el diseño del autor, después de «Интерфейсы: контракт, явная реализация, DIM»; ~2 h
  • Nivel 8 · Метаданные: рефлексия, атрибуты, генераторы кода — según el diseño del autor, después de cualquiera de estas: «Что на самом деле происходит, когда вы жмёте F5», «Обобщения: ограничения, реификация, вариантность»; ~2 h
  • Nivel 8 · Коллекции: выбор структуры данных и её цена — según el diseño del autor, después de «Обобщения: ограничения, реификация, вариантность»; ~2 h
  • Nivel 8 · OCP: открыт для расширения, закрыт для изменения — según el diseño del autor, después de «SRP: одна причина для изменения»; ~2 h
  • Nivel 9 · LINQ: отложенное выполнение, yield, IQueryable — según el diseño del autor, después de «Коллекции: выбор структуры данных и её цена»; ~2 h
  • Nivel 9 · LSP: подтип обязан быть заменяемым — según el diseño del autor, después de «OCP: открыт для расширения, закрыт для изменения»; ~2 h
  • Nivel 10 · ISP: клиента не заставляют зависеть от лишнего — según el diseño del autor, después de «LSP: подтип обязан быть заменяемым»; ~1,5 h
  • Nivel 11 · DIP и внедрение зависимостей — según el diseño del autor, después de «ISP: клиента не заставляют зависеть от лишнего»; ~2,5 h
  • Nivel 12 · Порождающие паттерны: кто и как создаёт объекты — según el diseño del autor, después de «DIP и внедрение зависимостей»; ~2 h
  • Nivel 12 · Структурные паттерны: как собирать объекты в целое — según el diseño del autor, después de «DIP и внедрение зависимостей»; ~2 h
  • Nivel 12 · Поведенческие паттерны: кто кого вызывает и когда — según el diseño del autor, después de «DIP и внедрение зависимостей», «Делегаты, лямбды, замыкания, события»; ~2 h
  • Nivel 12 · Хост, DI на практике, конфигурация, логирование — según el diseño del autor, después de «DIP и внедрение зависимостей»; opcional; ~2 h
  • Nivel 13 · Прикладные паттерны .NET: Repository, Options, CQRS, Result — según el diseño del autor, después de 2 de estas: «Порождающие паттерны: кто и как создаёт объекты», «Структурные паттерны: как собирать объекты в целое», «Поведенческие паттерны: кто кого вызывает и когда»; ~2 h
  • Nivel 13 · Minimal API: конвейер, привязка, валидация, ошибки — según el diseño del autor, después de «Хост, DI на практике, конфигурация, логирование»; opcional; ~2 h
  • Nivel 13 · HttpClient, устойчивость и фоновые задачи — según el diseño del autor, después de «Хост, DI на практике, конфигурация, логирование», «async/await: что это и чего это не»; opcional; ~2 h
  • Nivel 13 · EF Core без иллюзий — según el diseño del autor, después de «Хост, DI на практике, конфигурация, логирование», «LINQ: отложенное выполнение, yield, IQueryable»; opcional; ~2 h
  • Nivel 14 · Финал: тестируемость и разговор об архитектуре вслух — según el diseño del autor, después de «Прикладные паттерны .NET: Repository, Options, CQRS, Result», «async/await: что это и чего это не»; ~2,5 h
  • Nivel 14 · Выпуск в Azure: App Service, секреты, managed identity — según el diseño del autor, después de «Minimal API: конвейер, привязка, валидация, ошибки»; opcional; ~2 h
  • Nivel 15 · Что нового в C# 13 и 14 и как об этом спрашивают — según el diseño del autor, después de «Финал: тестируемость и разговор об архитектуре вслух»; ~2 h
  • Nivel 15 · Тесты сервиса: от модуля до HTTP — según el diseño del autor, después de «Хост, DI на практике, конфигурация, логирование», «Финал: тестируемость и разговор об архитектуре вслух»; opcional; ~2 h

Programa · 38 unidades

1Что на самом деле происходит, когда вы жмёте F5

Описать путь от исходника до машинного кода: Roslyn → IL и метаданные → JIT (tier0 → tier1) → машинный код, и что меняют Debug и Release

~2 h
2Значимые и ссылочные типы: стек, куча и упаковка

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

~2 h
3Память и время жизни: сборщик мусора, IDisposable, using

Объяснить поколенческую сборку и почему её цена определяется выжившими, а не мёртвыми объектами

~2 h
4class, struct, record: чем объявлять данные

Выбирать между class, struct, record class, record struct и readonly record struct по вопросу «значение или сущность», а не по привычке

~2 h
5Равенство, хеш и сравнение: контракт, который легко нарушить

Предсказывать, что сравнивает == и что сравнивает Equals, по статическому и настоящему типу

~2 h
6null: nullable-типы, ссылочная нулевая аннотация и что с этим делать

Различать Nullable<T> и nullable reference types: что делает компилятор, что делает рантайм (особая упаковка) и что не делает никто

~1,5 h
7Сопоставление с образцом, кортежи, деконструкция

Переписывать цепочки if/else с is и приведениями в switch-выражение и объяснять, почему порядок веток — часть смысла

~2 h
8Span, Memory, ref struct и как мерить

Объяснять, что такое Span<T> и ReadOnlySpan<T>, и предсказывать, где срез даёт окно, а где копию

~2 h
9Строки: неизменяемость, интернирование, StringBuilder, Span

Объяснять, что неизменяемость string даёт (безопасная передача, потокобезопасное чтение, надёжный ключ, интернирование) и чего не даёт (кэширования хеша, возможности стереть секрет)

~1,5 h
10Инкапсуляция и конструирование: объект, который нельзя собрать неправильно

Объяснять инкапсуляцию через инварианты и проектировать тип, в котором невалидное состояние невыразимо

~2 h
11Наследование и полиморфизм: virtual, override, new, sealed

Точно предсказывать, какая реализация вызовется при virtual/override, new и new virtual, через базовую и производную ссылку

~2 h
12Интерфейсы: контракт, явная реализация, DIM

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

~1,5 h
13Делегаты, лямбды, замыкания, события

Объяснить устройство делегата (Target, Method, список вызова) и предсказать результат многоадресного вызова, в том числе с исключением

~2 h
14Обобщения: ограничения, реификация, вариантность

Объяснить реификацию обобщений: отдельный машинный код для значимых T, общий для ссылочных, реальный тип в рантайме

~2 h
15Метаданные: рефлексия, атрибуты, генераторы кода

Объяснить, что такое метаданные сборки и что делает рефлексия (Type, GetProperties, PropertyInfo.GetValue), и назвать её цену: поиск членов, позднее связывание, упаковка, негарантированный порядок

~2 h
16Коллекции: выбор структуры данных и её цена

Выбирать коллекцию по горячей операции, изменяемости, нужному порядку и числу писателей, а не по привычке

~2 h
17LINQ: отложенное выполнение, yield, IQueryable

Объяснить отложенное выполнение как вытягивание элементов по одному с конца цепочки и предсказывать его эффекты: повторную работу, изменения источника, захваченные переменные

~2 h
18Исключения: чем они являются и чем не являются

Решать по контракту метода, что является исключением, а что — ожидаемым результатом

~2 h
19Данные на границе: JSON, файлы и потоки, даты и время

Настроить System.Text.Json для внешнего контракта: один экземпляр JsonSerializerOptions, политика имён, строгость (required, RespectNullableAnnotations, RespectRequiredConstructorParameters из .NET 9), полиморфизм

~2 h
20async/await: что это и чего это не

Объяснить, почему async освобождает поток на время ожидания, а не создаёт новый, и чем масштабируемость отличается от скорости

~2,5 h
21Конкурентность: lock, Lock, Interlocked, SemaphoreSlim, Channel, Parallel

Объяснить гонку read-modify-write и предсказать, что произойдёт с общим полем, которое меняют несколько потоков

~2 h
22SRP: одна причина для изменения

Сформулировать SRP через причину для изменения: один актор, приходящий с требованиями

~2 h
23OCP: открыт для расширения, закрыт для изменения

Объяснить OCP через давление: одно изменение требований — правки в нескольких работающих модулях

~2 h
24LSP: подтип обязан быть заменяемым

Сформулировать LSP через ожидания вызывающего кода и контракт базы: предусловия, постусловия, инварианты, история и исключения

~2 h
25ISP: клиента не заставляют зависеть от лишнего

Объяснить ISP через механику зависимости: изменение толстого интерфейса пересобирает и ломает клиентов, которым изменившийся член не нужен

~1,5 h
26DIP и внедрение зависимостей

Сформулировать обе части DIP и показать, почему вторая (контракт на языке потребителя и у потребителя) важнее

~2,5 h
27Порождающие паттерны: кто и как создаёт объекты

Называть давление, которое снимает каждый порождающий паттерн, и случаи, когда хватает new

~2 h
28Структурные паттерны: как собирать объекты в целое

Различать Adapter, Decorator, Facade и Proxy по намерению и по тому, меняется ли интерфейс

~2 h
29Поведенческие паттерны: кто кого вызывает и когда

Узнавать давление, порождающее Strategy, Template Method, Observer, Command, State и Chain of Responsibility, на коде ENGAGE

~2 h
30Прикладные паттерны .NET: Repository, Options, CQRS, Result

Аргументированно решать, нужен ли свой репозиторий поверх EF Core, и называть, чем обедняет общий IRepository<T>

~2 h
31Что нового в C# 13 и 14 и как об этом спрашивают

Отнести возможность к версии языка: раньше C# 13, C# 13 (.NET 9) или C# 14 (.NET 10) — и не выдавать старое за новое

~2 h
32Финал: тестируемость и разговор об архитектуре вслух

Связывать трудности тестирования с конкретными дефектами проектирования: new внутри метода, статика, DateTime.Now, new HttpClient(), файловая система

~2,5 h
33Хост, DI на практике, конфигурация, логирование

Объяснить, что регистрируют Host.CreateApplicationBuilder и WebApplication.CreateBuilder, и собрать Program.cs как composition root с областями для Scoped-сервисов

~2 h
34Minimal API: конвейер, привязка, валидация, ошибки

Предсказать источник каждого параметра обработчика (маршрут, строка запроса, тело, DI, [AsParameters]) и ответ на ошибку привязки

~2 h
35HttpClient, устойчивость и фоновые задачи

Объяснить, почему new HttpClient() на каждый запрос исчерпывает порты, а вечный статический клиент не видит смены DNS, и выбрать между IHttpClientFactory и долгоживущим клиентом с PooledConnectionLifetime

~2 h
36EF Core без иллюзий

Определять, какая часть LINQ-запроса уйдёт в SQL, а какая выполнится в памяти: Expression против Func, ToList в середине цепочки, непереводимые вызовы методов

~2 h
37Тесты сервиса: от модуля до HTTP

Объяснить, какой класс дефектов ловит каждый уровень тестов сервиса, и выбрать между пирамидой и ромбом по тому, где живут ошибки

~2 h
38Выпуск в Azure: App Service, секреты, managed identity

Опубликовать сервис ENGAGE (dotnet publish) и выбрать режим: framework-dependent, self-contained или ReadyToRun — с ценой каждого

~2 h