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. Матеріал російською.
Заняття — вашою мовою: його веде асистент.
- Матеріал: російська
- Іспит: російська — складається на сайті, без перекладу
Як це влаштовано
Асистент бере матеріал курсу з нашого сервера й веде заняття вашою мовою.
Іспит складається на сайті, без асистента. Питання іспиту не перекладаються: так вирішено для всіх курсів.
Шлях курсом
· юнітів: 38порядок вільний · сходинки нижче — той порядок, який пропонує автор, а не умоваВигляд: карта · щаблі
Щабель 1
~2 год
Щабель 2
~2 год
2 · за задумом автора — після «Що насправді відбувається, коли ви натискаєте F5»
Типи значень і посилальні типи: стек, купа й упакування
~2 год
Щабель 3
~5,5 год
за задумом автора — після «Типи значень і посилальні типи: стек, купа й упакування»
Щабель 4
~7,5 год
5 · за задумом автора — після «class, struct, record: чим оголошувати дані»
Рівність, хеш і порівняння: контракт, який легко порушити
~2 год
6 · за задумом автора — після «class, struct, record: чим оголошувати дані»
null: nullable-типи, посилальна анотація null і що з цим робити
~1,5 год
28 · за задумом автора — після будь-якого із: «Типи значень і посилальні типи: стек, купа й упакування», «Рядки: незмінність, інтернування, StringBuilder, Span»
Span, Memory, ref struct і як вимірювати
~2 год
8 · за задумом автора — після «class, struct, record: чим оголошувати дані»
Інкапсуляція і конструювання: об'єкт, який не можна зібрати неправильно
~2 год
Щабель 5
~8 год
27 · за задумом автора — після будь-якого із: «class, struct, record: чим оголошувати дані», «null: nullable-типи, посилальна анотація null і що з цим робити»
Зіставлення зі зразком, кортежі, деконструкція
~2 год
9 · за задумом автора — після «Інкапсуляція і конструювання: об'єкт, який не можна зібрати неправильно»
Успадкування і поліморфізм: virtual, override, new, sealed
~2 год
11 · за задумом автора — після «Інкапсуляція і конструювання: об'єкт, який не можна зібрати неправильно»
Делегати, лямбди, замикання, події
~2 год
15 · за задумом автора — після «Інкапсуляція і конструювання: об'єкт, який не можна зібрати неправильно»
Винятки: чим вони є і чим не є
~2 год
Щабель 6
~4 год
10 · за задумом автора — після «Успадкування і поліморфізм: virtual, override, new, sealed»
Інтерфейси: контракт, явна реалізація, DIM
~1,5 год
16 · за задумом автора — після «Делегати, лямбди, замикання, події»
async/await: що це і чим це не є
~2,5 год
Щабель 7
~8 год
12 · за задумом автора — після «Інтерфейси: контракт, явна реалізація, DIM»
Узагальнення: обмеження, реіфікація, варіантність
~2 год
30 · за задумом автора — після будь-якого із: «Винятки: чим вони є і чим не є», «async/await: що це і чим це не є»
Дані на межі: JSON, файли й потоки, дати й час
~2 год
29 · за задумом автора — після «async/await: що це і чим це не є»
Конкурентність: lock, Lock, Interlocked, SemaphoreSlim, Channel, Parallel
~2 год
17 · за задумом автора — після «Інтерфейси: контракт, явна реалізація, DIM»
~2 год
Щабель 8
~6 год
31 · за задумом автора — після будь-якого із: «Що насправді відбувається, коли ви натискаєте F5», «Узагальнення: обмеження, реіфікація, варіантність»
Метадані: рефлексія, атрибути, генератори коду
~2 год
13 · за задумом автора — після «Узагальнення: обмеження, реіфікація, варіантність»
Колекції: вибір структури даних і її ціна
~2 год
18 · за задумом автора — після «SRP: одна причина для зміни»
OCP: відкритий для розширення, закритий для зміни
~2 год
Щабель 9
~4 год
14 · за задумом автора — після «Колекції: вибір структури даних і її ціна»
LINQ: відкладене виконання, yield, IQueryable
~2 год
19 · за задумом автора — після «OCP: відкритий для розширення, закритий для зміни»
LSP: підтип зобов'язаний бути замінним
~2 год
Щабель 10
~1,5 год
20 · за задумом автора — після «LSP: підтип зобов'язаний бути замінним»
ISP: клієнта не змушують залежати від зайвого
~1,5 год
Щабель 11
~2,5 год
21 · за задумом автора — після «ISP: клієнта не змушують залежати від зайвого»
DIP і впровадження залежностей
~2,5 год
Щабель 12
~8 год
22 · за задумом автора — після «DIP і впровадження залежностей»
Породжувальні патерни: хто і як створює об'єкти
~2 год
23 · за задумом автора — після «DIP і впровадження залежностей»
Структурні патерни: як збирати об'єкти в ціле
~2 год
24 · за задумом автора — після «DIP і впровадження залежностей», «Делегати, лямбди, замикання, події»
Поведінкові патерни: хто кого викликає і коли
~2 год
33 · C# в приложении · за задумом автора — після «DIP і впровадження залежностей»
Хост, DI на практиці, конфігурація, логування
~2 год
Щабель 13
~8 год
25 · за задумом автора — після 2 із: «Породжувальні патерни: хто і як створює об'єкти», «Структурні патерни: як збирати об'єкти в ціле», «Поведінкові патерни: хто кого викликає і коли»
Прикладні патерни .NET: Repository, Options, CQRS, Result
~2 год
34 · C# в приложении · за задумом автора — після «Хост, DI на практиці, конфігурація, логування»
Minimal API: конвеєр, прив'язування, валідація, помилки
~2 год
35 · C# в приложении · за задумом автора — після «Хост, DI на практиці, конфігурація, логування», «async/await: що це і чим це не є»
HttpClient, стійкість і фонові задачі
~2 год
36 · C# в приложении · за задумом автора — після «Хост, DI на практиці, конфігурація, логування», «LINQ: відкладене виконання, yield, IQueryable»
~2 год
Щабель 14
~4,5 год
26 · за задумом автора — після «Прикладні патерни .NET: Repository, Options, CQRS, Result», «async/await: що це і чим це не є»
Фінал: тестованість і розмова про архітектуру вголос
~2,5 год
38 · C# в приложении · за задумом автора — після «Minimal API: конвеєр, прив'язування, валідація, помилки»
Випуск в Azure: App Service, секрети, managed identity
~2 год
Щабель 15
~4 год
32 · за задумом автора — після «Фінал: тестованість і розмова про архітектуру вголос»
Що нового в C# 13 і 14 і як про це запитують
~2 год
37 · C# в приложении · за задумом автора — після «Хост, DI на практиці, конфігурація, логування», «Фінал: тестованість і розмова про архітектуру вголос»
Тести сервісу: від модуля до HTTP
~2 год
Іспит
закрито · записатися на курс
фінал · у браузері, без асистента
Іспит
Шлях курсом словами
- Щабель 1 · Що насправді відбувається, коли ви натискаєте F5 — ~2 год
- Щабель 2 · Типи значень і посилальні типи: стек, купа й упакування — за задумом автора — після «Що насправді відбувається, коли ви натискаєте F5»; ~2 год
- Щабель 3 · Пам'ять і час життя: збирач сміття, IDisposable, using — за задумом автора — після «Типи значень і посилальні типи: стек, купа й упакування»; ~2 год
- Щабель 3 · class, struct, record: чим оголошувати дані — за задумом автора — після «Типи значень і посилальні типи: стек, купа й упакування»; ~2 год
- Щабель 3 · Рядки: незмінність, інтернування, StringBuilder, Span — за задумом автора — після «Типи значень і посилальні типи: стек, купа й упакування»; ~1,5 год
- Щабель 4 · Рівність, хеш і порівняння: контракт, який легко порушити — за задумом автора — після «class, struct, record: чим оголошувати дані»; ~2 год
- Щабель 4 · null: nullable-типи, посилальна анотація null і що з цим робити — за задумом автора — після «class, struct, record: чим оголошувати дані»; ~1,5 год
- Щабель 4 · Span, Memory, ref struct і як вимірювати — за задумом автора — після будь-якого із: «Типи значень і посилальні типи: стек, купа й упакування», «Рядки: незмінність, інтернування, StringBuilder, Span»; ~2 год
- Щабель 4 · Інкапсуляція і конструювання: об'єкт, який не можна зібрати неправильно — за задумом автора — після «class, struct, record: чим оголошувати дані»; ~2 год
- Щабель 5 · Зіставлення зі зразком, кортежі, деконструкція — за задумом автора — після будь-якого із: «class, struct, record: чим оголошувати дані», «null: nullable-типи, посилальна анотація null і що з цим робити»; ~2 год
- Щабель 5 · Успадкування і поліморфізм: virtual, override, new, sealed — за задумом автора — після «Інкапсуляція і конструювання: об'єкт, який не можна зібрати неправильно»; ~2 год
- Щабель 5 · Делегати, лямбди, замикання, події — за задумом автора — після «Інкапсуляція і конструювання: об'єкт, який не можна зібрати неправильно»; ~2 год
- Щабель 5 · Винятки: чим вони є і чим не є — за задумом автора — після «Інкапсуляція і конструювання: об'єкт, який не можна зібрати неправильно»; ~2 год
- Щабель 6 · Інтерфейси: контракт, явна реалізація, DIM — за задумом автора — після «Успадкування і поліморфізм: virtual, override, new, sealed»; ~1,5 год
- Щабель 6 · async/await: що це і чим це не є — за задумом автора — після «Делегати, лямбди, замикання, події»; ~2,5 год
- Щабель 7 · Узагальнення: обмеження, реіфікація, варіантність — за задумом автора — після «Інтерфейси: контракт, явна реалізація, DIM»; ~2 год
- Щабель 7 · Дані на межі: JSON, файли й потоки, дати й час — за задумом автора — після будь-якого із: «Винятки: чим вони є і чим не є», «async/await: що це і чим це не є»; ~2 год
- Щабель 7 · Конкурентність: lock, Lock, Interlocked, SemaphoreSlim, Channel, Parallel — за задумом автора — після «async/await: що це і чим це не є»; ~2 год
- Щабель 7 · SRP: одна причина для зміни — за задумом автора — після «Інтерфейси: контракт, явна реалізація, DIM»; ~2 год
- Щабель 8 · Метадані: рефлексія, атрибути, генератори коду — за задумом автора — після будь-якого із: «Що насправді відбувається, коли ви натискаєте F5», «Узагальнення: обмеження, реіфікація, варіантність»; ~2 год
- Щабель 8 · Колекції: вибір структури даних і її ціна — за задумом автора — після «Узагальнення: обмеження, реіфікація, варіантність»; ~2 год
- Щабель 8 · OCP: відкритий для розширення, закритий для зміни — за задумом автора — після «SRP: одна причина для зміни»; ~2 год
- Щабель 9 · LINQ: відкладене виконання, yield, IQueryable — за задумом автора — після «Колекції: вибір структури даних і її ціна»; ~2 год
- Щабель 9 · LSP: підтип зобов'язаний бути замінним — за задумом автора — після «OCP: відкритий для розширення, закритий для зміни»; ~2 год
- Щабель 10 · ISP: клієнта не змушують залежати від зайвого — за задумом автора — після «LSP: підтип зобов'язаний бути замінним»; ~1,5 год
- Щабель 11 · DIP і впровадження залежностей — за задумом автора — після «ISP: клієнта не змушують залежати від зайвого»; ~2,5 год
- Щабель 12 · Породжувальні патерни: хто і як створює об'єкти — за задумом автора — після «DIP і впровадження залежностей»; ~2 год
- Щабель 12 · Структурні патерни: як збирати об'єкти в ціле — за задумом автора — після «DIP і впровадження залежностей»; ~2 год
- Щабель 12 · Поведінкові патерни: хто кого викликає і коли — за задумом автора — після «DIP і впровадження залежностей», «Делегати, лямбди, замикання, події»; ~2 год
- Щабель 12 · Хост, DI на практиці, конфігурація, логування — за задумом автора — після «DIP і впровадження залежностей»; необовʼязковий; ~2 год
- Щабель 13 · Прикладні патерни .NET: Repository, Options, CQRS, Result — за задумом автора — після 2 із: «Породжувальні патерни: хто і як створює об'єкти», «Структурні патерни: як збирати об'єкти в ціле», «Поведінкові патерни: хто кого викликає і коли»; ~2 год
- Щабель 13 · Minimal API: конвеєр, прив'язування, валідація, помилки — за задумом автора — після «Хост, DI на практиці, конфігурація, логування»; необовʼязковий; ~2 год
- Щабель 13 · HttpClient, стійкість і фонові задачі — за задумом автора — після «Хост, DI на практиці, конфігурація, логування», «async/await: що це і чим це не є»; необовʼязковий; ~2 год
- Щабель 13 · EF Core без ілюзій — за задумом автора — після «Хост, DI на практиці, конфігурація, логування», «LINQ: відкладене виконання, yield, IQueryable»; необовʼязковий; ~2 год
- Щабель 14 · Фінал: тестованість і розмова про архітектуру вголос — за задумом автора — після «Прикладні патерни .NET: Repository, Options, CQRS, Result», «async/await: що це і чим це не є»; ~2,5 год
- Щабель 14 · Випуск в Azure: App Service, секрети, managed identity — за задумом автора — після «Minimal API: конвеєр, прив'язування, валідація, помилки»; необовʼязковий; ~2 год
- Щабель 15 · Що нового в C# 13 і 14 і як про це запитують — за задумом автора — після «Фінал: тестованість і розмова про архітектуру вголос»; ~2 год
- Щабель 15 · Тести сервісу: від модуля до HTTP — за задумом автора — після «Хост, DI на практиці, конфігурація, логування», «Фінал: тестованість і розмова про архітектуру вголос»; необовʼязковий; ~2 год
Програма · 38 юнітів
| 1 | Що насправді відбувається, коли ви натискаєте F5 Описати шлях від вихідного коду до машинного коду: Roslyn → IL і метадані → JIT (tier0 → tier1) → машинний код, і що змінюють Debug і Release | ~2 год |
| 2 | Типи значень і посилальні типи: стек, купа й упакування Передбачати поведінку коду під час присвоєння та передавання в метод для типів значень і посилальних типів, зокрема структур у колекціях і кортежів | ~2 год |
| 3 | Пам'ять і час життя: збирач сміття, IDisposable, using Пояснити поколіннєве збирання і чому його ціну визначають об'єкти, що вижили, а не мертві | ~2 год |
| 4 | class, struct, record: чим оголошувати дані Обирати між class, struct, record class, record struct і readonly record struct за питанням «значення чи сутність», а не за звичкою | ~2 год |
| 5 | Рівність, хеш і порівняння: контракт, який легко порушити Передбачати, що порівнює ==, а що порівнює Equals, за статичним і справжнім типом | ~2 год |
| 6 | null: nullable-типи, посилальна анотація null і що з цим робити Розрізняти Nullable<T> і nullable reference types: що робить компілятор, що робить рантайм (особливе упакування) і чого не робить ніхто | ~1,5 год |
| 7 | Зіставлення зі зразком, кортежі, деконструкція Переписувати ланцюжки if/else з is і зведеннями типів у switch-вираз і пояснювати, чому порядок гілок — частина змісту | ~2 год |
| 8 | Span, Memory, ref struct і як вимірювати Пояснювати, що таке Span<T> і ReadOnlySpan<T>, і передбачати, де зріз дає вікно, а де копію | ~2 год |
