До вмісту
L-SYSTEM

рекомендованийсередній

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

порядок вільний · сходинки нижче — той порядок, який пропонує автор, а не умоваВигляд: карта · щаблі

28

Span, Memory, ref struct і як вимірювати

~2 год

за задумом автора — після будь-якого із: «Типи значень і посилальні типи: стек, купа й упакування», «Рядки: незмінність, інтернування, StringBuilder, Span»

25

Прикладні патерни .NET: Repository, Options, CQRS, Result

~2 год

за задумом автора — після 2 із: «Породжувальні патерни: хто і як створює об'єкти», «Структурні патерни: як збирати об'єкти в ціле», «Поведінкові патерни: хто кого викликає і коли»

36 · C# в приложении

EF Core без ілюзій

~2 год

за задумом автора — після «Хост, DI на практиці, конфігурація, логування», «LINQ: відкладене виконання, yield, IQueryable»

37 · C# в приложении

Тести сервісу: від модуля до HTTP

~2 год

за задумом автора — після «Хост, DI на практиці, конфігурація, логування», «Фінал: тестованість і розмова про архітектуру вголос»

фінал · у браузері, без асистента

Іспит

закрито · записатися на курс

Шлях курсом словами
  • Щабель 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 год
4class, struct, record: чим оголошувати дані

Обирати між class, struct, record class, record struct і readonly record struct за питанням «значення чи сутність», а не за звичкою

~2 год
5Рівність, хеш і порівняння: контракт, який легко порушити

Передбачати, що порівнює ==, а що порівнює Equals, за статичним і справжнім типом

~2 год
6null: nullable-типи, посилальна анотація null і що з цим робити

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

~1,5 год
7Зіставлення зі зразком, кортежі, деконструкція

Переписувати ланцюжки if/else з is і зведеннями типів у switch-вираз і пояснювати, чому порядок гілок — частина змісту

~2 год
8Span, Memory, ref struct і як вимірювати

Пояснювати, що таке Span<T> і ReadOnlySpan<T>, і передбачати, де зріз дає вікно, а де копію

~2 год
9Рядки: незмінність, інтернування, StringBuilder, Span

Пояснювати, що дає незмінність string (безпечна передача, потокобезпечне читання, надійний ключ, інтернування) і чого не дає (кешування хешу, можливості стерти секрет)

~1,5 год
10Інкапсуляція і конструювання: об'єкт, який не можна зібрати неправильно

Пояснювати інкапсуляцію через інваріанти і проєктувати тип, у якому невалідний стан неможливо виразити

~2 год
11Успадкування і поліморфізм: virtual, override, new, sealed

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

~2 год
12Інтерфейси: контракт, явна реалізація, DIM

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

~1,5 год
13Делегати, лямбди, замикання, події

Пояснити будову делегата (Target, Method, список виклику) і передбачити результат багатоадресного виклику, зокрема з винятком

~2 год
14Узагальнення: обмеження, реіфікація, варіантність

Пояснити реіфікацію узагальнень: окремий машинний код для T — типів значень, спільний для посилальних, реальний тип у рантаймі

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

Пояснити, що таке метадані збірки і що робить рефлексія (Type, GetProperties, PropertyInfo.GetValue), і назвати її ціну: пошук членів, пізнє зв'язування, упакування, негарантований порядок

~2 год
16Колекції: вибір структури даних і її ціна

Обирати колекцію за гарячою операцією, змінністю, потрібним порядком і кількістю писачів, а не за звичкою

~2 год
17LINQ: відкладене виконання, yield, IQueryable

Пояснити відкладене виконання як витягування елементів по одному з кінця ланцюжка і передбачати його ефекти: повторну роботу, зміни джерела, захоплені змінні

~2 год
18Винятки: чим вони є і чим не є

Вирішувати за контрактом методу, що є винятком, а що — очікуваним результатом

~2 год
19Дані на межі: JSON, файли й потоки, дати й час

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

~2 год
20async/await: що це і чим це не є

Пояснити, чому async звільняє потік на час очікування, а не створює новий, і чим масштабованість відрізняється від швидкості

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

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

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

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

~2 год
23OCP: відкритий для розширення, закритий для зміни

Пояснити OCP через тиск: одна зміна вимог — правки в кількох робочих модулях

~2 год
24LSP: підтип зобов'язаний бути замінним

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

~2 год
25ISP: клієнта не змушують залежати від зайвого

Пояснити ISP через механіку залежності: зміна товстого інтерфейсу перезбирає і ламає клієнтів, яким змінений член не потрібен

~1,5 год
26DIP і впровадження залежностей

Сформулювати обидві частини DIP і показати, чому друга (контракт мовою споживача і в споживача) важливіша

~2,5 год
27Породжувальні патерни: хто і як створює об'єкти

Називати тиск, який знімає кожен породжувальний патерн, і випадки, коли досить new

~2 год
28Структурні патерни: як збирати об'єкти в ціле

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

~2 год
29Поведінкові патерни: хто кого викликає і коли

Розпізнавати тиск, що породжує Strategy, Template Method, Observer, Command, State і Chain of Responsibility, на коді ENGAGE

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

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

~2 год
31Що нового в C# 13 і 14 і як про це запитують

Віднести можливість до версії мови: раніше за C# 13, C# 13 (.NET 9) чи C# 14 (.NET 10) — і не видавати старе за нове

~2 год
32Фінал: тестованість і розмова про архітектуру вголос

Пов'язувати труднощі тестування з конкретними дефектами проєктування: new всередині методу, статика, DateTime.Now, new HttpClient(), файлова система

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

Пояснити, що реєструють Host.CreateApplicationBuilder і WebApplication.CreateBuilder, і зібрати Program.cs як composition root з областями для Scoped-сервісів

~2 год
34Minimal API: конвеєр, прив'язування, валідація, помилки

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

~2 год
35HttpClient, стійкість і фонові задачі

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

~2 год
36EF Core без ілюзій

Визначати, яка частина LINQ-запиту піде в SQL, а яка виконається в пам'яті: Expression проти Func, ToList посередині ланцюжка, неперекладні виклики методів

~2 год
37Тести сервісу: від модуля до HTTP

Пояснити, який клас дефектів ловить кожен рівень тестів сервісу, і обрати між пірамідою та ромбом за тим, де живуть помилки

~2 год
38Випуск в Azure: App Service, секрети, managed identity

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

~2 год