C# 14 and .NET 10: From Surface Knowledge to Working Knowledge (Extended)
For developers who "know C#" but stall at code review and in interviews when asked why something is built the way it is. The language is taught not as a list of constructs but as a set of decisions with a price: value and reference types, memory and the garbage collector, equality, null, pattern matching, strings and Span, generics, collections, LINQ, exceptions, async and concurrency, data at the process boundary, reflection and source generators. Five units then take SOLID one principle at a time, each as the answer to a concrete pain rather than a slogan. Design patterns follow — creational, structural, behavioural and the applied .NET ones — always including the case where the pattern hurts. The course closes on testability, talking through an architecture decision out loud, and what is new in C# 13 and 14. An optional branch, "C# in an application", takes the language into a working service: the host and DI, Minimal APIs, HttpClient and background jobs, EF Core, tests, and deployment to Azure. Every example lives in one system, the ENGAGE backend of the fictional firm Aldervane. Targets C# 14 / .NET 10 LTS. Written in Russian.
Path through the course
· 38 unitsthe order is free · the steps below are the order the author suggests, not a conditionView: map · steps
Stage 1
~2 h
Stage 2
~2 h
2 · by the author’s design, after “Что на самом деле происходит, когда вы жмёте F5”
Значимые и ссылочные типы: стек, куча и упаковка
~2 h
Stage 3
~5.5 h
by the author’s design, after “Значимые и ссылочные типы: стек, куча и упаковка”
Stage 4
~7.5 h
5 · by the author’s design, after “class, struct, record: чем объявлять данные”
Равенство, хеш и сравнение: контракт, который легко нарушить
~2 h
6 · by the author’s design, after “class, struct, record: чем объявлять данные”
null: nullable-типы, ссылочная нулевая аннотация и что с этим делать
~1.5 h
28 · by the author’s design, after any one of these: “Значимые и ссылочные типы: стек, куча и упаковка”, “Строки: неизменяемость, интернирование, StringBuilder, Span”
Span, Memory, ref struct и как мерить
~2 h
8 · by the author’s design, after “class, struct, record: чем объявлять данные”
Инкапсуляция и конструирование: объект, который нельзя собрать неправильно
~2 h
Stage 5
~8 h
27 · by the author’s design, after any one of these: “class, struct, record: чем объявлять данные”, “null: nullable-типы, ссылочная нулевая аннотация и что с этим делать”
Сопоставление с образцом, кортежи, деконструкция
~2 h
9 · by the author’s design, after “Инкапсуляция и конструирование: объект, который нельзя собрать неправильно”
Наследование и полиморфизм: virtual, override, new, sealed
~2 h
11 · by the author’s design, after “Инкапсуляция и конструирование: объект, который нельзя собрать неправильно”
Делегаты, лямбды, замыкания, события
~2 h
15 · by the author’s design, after “Инкапсуляция и конструирование: объект, который нельзя собрать неправильно”
Исключения: чем они являются и чем не являются
~2 h
Stage 6
~4 h
10 · by the author’s design, after “Наследование и полиморфизм: virtual, override, new, sealed”
Интерфейсы: контракт, явная реализация, DIM
~1.5 h
16 · by the author’s design, after “Делегаты, лямбды, замыкания, события”
async/await: что это и чего это не
~2.5 h
Stage 7
~8 h
12 · by the author’s design, after “Интерфейсы: контракт, явная реализация, DIM”
Обобщения: ограничения, реификация, вариантность
~2 h
30 · by the author’s design, after any one of these: “Исключения: чем они являются и чем не являются”, “async/await: что это и чего это не”
Данные на границе: JSON, файлы и потоки, даты и время
~2 h
29 · by the author’s design, after “async/await: что это и чего это не”
Конкурентность: lock, Lock, Interlocked, SemaphoreSlim, Channel, Parallel
~2 h
17 · by the author’s design, after “Интерфейсы: контракт, явная реализация, DIM”
SRP: одна причина для изменения
~2 h
Stage 8
~6 h
31 · by the author’s design, after any one of these: “Что на самом деле происходит, когда вы жмёте F5”, “Обобщения: ограничения, реификация, вариантность”
Метаданные: рефлексия, атрибуты, генераторы кода
~2 h
13 · by the author’s design, after “Обобщения: ограничения, реификация, вариантность”
Коллекции: выбор структуры данных и её цена
~2 h
18 · by the author’s design, after “SRP: одна причина для изменения”
OCP: открыт для расширения, закрыт для изменения
~2 h
Stage 9
~4 h
14 · by the author’s design, after “Коллекции: выбор структуры данных и её цена”
LINQ: отложенное выполнение, yield, IQueryable
~2 h
19 · by the author’s design, after “OCP: открыт для расширения, закрыт для изменения”
LSP: подтип обязан быть заменяемым
~2 h
Stage 10
~1.5 h
20 · by the author’s design, after “LSP: подтип обязан быть заменяемым”
ISP: клиента не заставляют зависеть от лишнего
~1.5 h
Stage 11
~2.5 h
21 · by the author’s design, after “ISP: клиента не заставляют зависеть от лишнего”
~2.5 h
Stage 12
~8 h
22 · by the author’s design, after “DIP и внедрение зависимостей”
Порождающие паттерны: кто и как создаёт объекты
~2 h
23 · by the author’s design, after “DIP и внедрение зависимостей”
Структурные паттерны: как собирать объекты в целое
~2 h
24 · by the author’s design, after “DIP и внедрение зависимостей”, “Делегаты, лямбды, замыкания, события”
Поведенческие паттерны: кто кого вызывает и когда
~2 h
33 · C# в приложении · by the author’s design, after “DIP и внедрение зависимостей”
Хост, DI на практике, конфигурация, логирование
~2 h
Stage 13
~8 h
25 · by the author’s design, after 2 of these: “Порождающие паттерны: кто и как создаёт объекты”, “Структурные паттерны: как собирать объекты в целое”, “Поведенческие паттерны: кто кого вызывает и когда”
Прикладные паттерны .NET: Repository, Options, CQRS, Result
~2 h
34 · C# в приложении · by the author’s design, after “Хост, DI на практике, конфигурация, логирование”
Minimal API: конвейер, привязка, валидация, ошибки
~2 h
35 · C# в приложении · by the author’s design, after “Хост, DI на практике, конфигурация, логирование”, “async/await: что это и чего это не”
HttpClient, устойчивость и фоновые задачи
~2 h
36 · C# в приложении · by the author’s design, after “Хост, DI на практике, конфигурация, логирование”, “LINQ: отложенное выполнение, yield, IQueryable”
~2 h
Stage 14
~4.5 h
26 · by the author’s design, after “Прикладные паттерны .NET: Repository, Options, CQRS, Result”, “async/await: что это и чего это не”
Финал: тестируемость и разговор об архитектуре вслух
~2.5 h
38 · C# в приложении · by the author’s design, after “Minimal API: конвейер, привязка, валидация, ошибки”
Выпуск в Azure: App Service, секреты, managed identity
~2 h
Stage 15
~4 h
32 · by the author’s design, after “Финал: тестируемость и разговор об архитектуре вслух”
Что нового в C# 13 и 14 и как об этом спрашивают
~2 h
37 · C# в приложении · by the author’s design, after “Хост, DI на практике, конфигурация, логирование”, “Финал: тестируемость и разговор об архитектуре вслух”
Тесты сервиса: от модуля до HTTP
~2 h
Exam
closed · enrol on the course
final · in the browser, without the assistant
Exam
The path in words
- Stage 1 · Что на самом деле происходит, когда вы жмёте F5 — ~2 h
- Stage 2 · Значимые и ссылочные типы: стек, куча и упаковка — by the author’s design, after “Что на самом деле происходит, когда вы жмёте F5”; ~2 h
- Stage 3 · Память и время жизни: сборщик мусора, IDisposable, using — by the author’s design, after “Значимые и ссылочные типы: стек, куча и упаковка”; ~2 h
- Stage 3 · class, struct, record: чем объявлять данные — by the author’s design, after “Значимые и ссылочные типы: стек, куча и упаковка”; ~2 h
- Stage 3 · Строки: неизменяемость, интернирование, StringBuilder, Span — by the author’s design, after “Значимые и ссылочные типы: стек, куча и упаковка”; ~1.5 h
- Stage 4 · Равенство, хеш и сравнение: контракт, который легко нарушить — by the author’s design, after “class, struct, record: чем объявлять данные”; ~2 h
- Stage 4 · null: nullable-типы, ссылочная нулевая аннотация и что с этим делать — by the author’s design, after “class, struct, record: чем объявлять данные”; ~1.5 h
- Stage 4 · Span, Memory, ref struct и как мерить — by the author’s design, after any one of these: “Значимые и ссылочные типы: стек, куча и упаковка”, “Строки: неизменяемость, интернирование, StringBuilder, Span”; ~2 h
- Stage 4 · Инкапсуляция и конструирование: объект, который нельзя собрать неправильно — by the author’s design, after “class, struct, record: чем объявлять данные”; ~2 h
- Stage 5 · Сопоставление с образцом, кортежи, деконструкция — by the author’s design, after any one of these: “class, struct, record: чем объявлять данные”, “null: nullable-типы, ссылочная нулевая аннотация и что с этим делать”; ~2 h
- Stage 5 · Наследование и полиморфизм: virtual, override, new, sealed — by the author’s design, after “Инкапсуляция и конструирование: объект, который нельзя собрать неправильно”; ~2 h
- Stage 5 · Делегаты, лямбды, замыкания, события — by the author’s design, after “Инкапсуляция и конструирование: объект, который нельзя собрать неправильно”; ~2 h
- Stage 5 · Исключения: чем они являются и чем не являются — by the author’s design, after “Инкапсуляция и конструирование: объект, который нельзя собрать неправильно”; ~2 h
- Stage 6 · Интерфейсы: контракт, явная реализация, DIM — by the author’s design, after “Наследование и полиморфизм: virtual, override, new, sealed”; ~1.5 h
- Stage 6 · async/await: что это и чего это не — by the author’s design, after “Делегаты, лямбды, замыкания, события”; ~2.5 h
- Stage 7 · Обобщения: ограничения, реификация, вариантность — by the author’s design, after “Интерфейсы: контракт, явная реализация, DIM”; ~2 h
- Stage 7 · Данные на границе: JSON, файлы и потоки, даты и время — by the author’s design, after any one of these: “Исключения: чем они являются и чем не являются”, “async/await: что это и чего это не”; ~2 h
- Stage 7 · Конкурентность: lock, Lock, Interlocked, SemaphoreSlim, Channel, Parallel — by the author’s design, after “async/await: что это и чего это не”; ~2 h
- Stage 7 · SRP: одна причина для изменения — by the author’s design, after “Интерфейсы: контракт, явная реализация, DIM”; ~2 h
- Stage 8 · Метаданные: рефлексия, атрибуты, генераторы кода — by the author’s design, after any one of these: “Что на самом деле происходит, когда вы жмёте F5”, “Обобщения: ограничения, реификация, вариантность”; ~2 h
- Stage 8 · Коллекции: выбор структуры данных и её цена — by the author’s design, after “Обобщения: ограничения, реификация, вариантность”; ~2 h
- Stage 8 · OCP: открыт для расширения, закрыт для изменения — by the author’s design, after “SRP: одна причина для изменения”; ~2 h
- Stage 9 · LINQ: отложенное выполнение, yield, IQueryable — by the author’s design, after “Коллекции: выбор структуры данных и её цена”; ~2 h
- Stage 9 · LSP: подтип обязан быть заменяемым — by the author’s design, after “OCP: открыт для расширения, закрыт для изменения”; ~2 h
- Stage 10 · ISP: клиента не заставляют зависеть от лишнего — by the author’s design, after “LSP: подтип обязан быть заменяемым”; ~1.5 h
- Stage 11 · DIP и внедрение зависимостей — by the author’s design, after “ISP: клиента не заставляют зависеть от лишнего”; ~2.5 h
- Stage 12 · Порождающие паттерны: кто и как создаёт объекты — by the author’s design, after “DIP и внедрение зависимостей”; ~2 h
- Stage 12 · Структурные паттерны: как собирать объекты в целое — by the author’s design, after “DIP и внедрение зависимостей”; ~2 h
- Stage 12 · Поведенческие паттерны: кто кого вызывает и когда — by the author’s design, after “DIP и внедрение зависимостей”, “Делегаты, лямбды, замыкания, события”; ~2 h
- Stage 12 · Хост, DI на практике, конфигурация, логирование — by the author’s design, after “DIP и внедрение зависимостей”; optional; ~2 h
- Stage 13 · Прикладные паттерны .NET: Repository, Options, CQRS, Result — by the author’s design, after 2 of these: “Порождающие паттерны: кто и как создаёт объекты”, “Структурные паттерны: как собирать объекты в целое”, “Поведенческие паттерны: кто кого вызывает и когда”; ~2 h
- Stage 13 · Minimal API: конвейер, привязка, валидация, ошибки — by the author’s design, after “Хост, DI на практике, конфигурация, логирование”; optional; ~2 h
- Stage 13 · HttpClient, устойчивость и фоновые задачи — by the author’s design, after “Хост, DI на практике, конфигурация, логирование”, “async/await: что это и чего это не”; optional; ~2 h
- Stage 13 · EF Core без иллюзий — by the author’s design, after “Хост, DI на практике, конфигурация, логирование”, “LINQ: отложенное выполнение, yield, IQueryable”; optional; ~2 h
- Stage 14 · Финал: тестируемость и разговор об архитектуре вслух — by the author’s design, after “Прикладные паттерны .NET: Repository, Options, CQRS, Result”, “async/await: что это и чего это не”; ~2.5 h
- Stage 14 · Выпуск в Azure: App Service, секреты, managed identity — by the author’s design, after “Minimal API: конвейер, привязка, валидация, ошибки”; optional; ~2 h
- Stage 15 · Что нового в C# 13 и 14 и как об этом спрашивают — by the author’s design, after “Финал: тестируемость и разговор об архитектуре вслух”; ~2 h
- Stage 15 · Тесты сервиса: от модуля до HTTP — by the author’s design, after “Хост, DI на практике, конфигурация, логирование”, “Финал: тестируемость и разговор об архитектуре вслух”; optional; ~2 h
Programme · 38 units
| 1 | Что на самом деле происходит, когда вы жмёте F5 Описать путь от исходника до машинного кода: Roslyn → IL и метаданные → JIT (tier0 → tier1) → машинный код, и что меняют Debug и Release | ~2 h |
| 2 | Значимые и ссылочные типы: стек, куча и упаковка Предсказывать поведение кода при присваивании и передаче в метод для значимых и ссылочных типов, включая структуры в коллекциях и кортежи | ~2 h |
| 3 | Память и время жизни: сборщик мусора, IDisposable, using Объяснить поколенческую сборку и почему её цена определяется выжившими, а не мёртвыми объектами | ~2 h |
| 4 | class, struct, record: чем объявлять данные Выбирать между class, struct, record class, record struct и readonly record struct по вопросу «значение или сущность», а не по привычке | ~2 h |
| 5 | Равенство, хеш и сравнение: контракт, который легко нарушить Предсказывать, что сравнивает == и что сравнивает Equals, по статическому и настоящему типу | ~2 h |
| 6 | null: nullable-типы, ссылочная нулевая аннотация и что с этим делать Различать Nullable<T> и nullable reference types: что делает компилятор, что делает рантайм (особая упаковка) и что не делает никто | ~1.5 h |
| 7 | Сопоставление с образцом, кортежи, деконструкция Переписывать цепочки if/else с is и приведениями в switch-выражение и объяснять, почему порядок веток — часть смысла | ~2 h |
| 8 | Span, Memory, ref struct и как мерить Объяснять, что такое Span<T> и ReadOnlySpan<T>, и предсказывать, где срез даёт окно, а где копию | ~2 h |
