Конспект
Лекційні матеріали
Теоретичні матеріали згруповані за розділами курсу. Оберіть підрозділ, щоб перейти до пояснень, прикладів і ключових понять.
Шукає по номеру, назві, опису, заголовках і тексту всіх тем.
01 Вступ 5 підрозділів
Роль платформи
Пояснює місце .NET у розробці на C#, роль платформи, CLR, бібліотек і загальну логіку виконання програм.
.NET Framework та сучасний .NET
Порівнює .NET Framework і сучасну .NET-платформу, пояснює еволюцію середовища та чому нові проєкти орієнтуються на актуальні версії .NET.
Керований та некерований код
Розкриває різницю між керованим і некерованим кодом та пояснює, яку роль у безпечному виконанні відіграє CLR.
JIT-компіляція
Пояснює JIT-компіляцію, проміжну мову CIL і те, як C#-код перетворюється на машинні інструкції під час виконання.
Питання для самоконтролю
Питання для самоконтролю — Розділ 1. Вступ 1.1. Роль платформи 1. Що таке C і що таке .NET? Чи є це одне й те саме? Поясніть, чому мову програмування і платформу важливо розрізняти. 2. Які три кроки проходить к
02 Основи програмування на C# 25 підрозділів
Структура програми
Знайомить зі структурою C#-програми: файлом Program.cs, інструкціями, блоками коду, коментарями та файлом проєкту.
Змінні та константи
Пояснює оголошення змінних і констант, іменування, присвоєння значень та базову роботу з даними в пам'яті.
Літерали
Розглядає літерали як фіксовані значення в коді: логічні, цілі, дробові, символьні, рядкові та null-значення.
Типи даних
Систематизує основні типи даних C#: цілі числа, дробові типи, bool, char, string, object і var.
Консольне введення-виведення
Пояснює роботу з консоллю: Console.WriteLine, Console.Write, інтерполяцію рядків, зчитування введення і перетворення введених значень.
Арифметичні операції
Показує арифметичні операції, пріоритет операторів, інкремент, декремент і типові приклади обчислень у C#.
Порозрядні операції
Розбирає побітові операції над двійковим поданням чисел: &, |, ^, ~, зсуви вліво і вправо та практичні приклади.
Операції присвоєння
Пояснює просте та складене присвоєння, скорочені оператори на кшталт +=, -=, *= і порядок виконання таких виразів.
Перетворення базових типів
Описує перетворення між базовими типами, різницю між розширювальними і звужувальними перетвореннями та можливі втрати даних.
Явні та неявні перетворення
Пояснює явні та неявні перетворення, механіку доповнення бітів, checked-контекст і поведінку при переповненні.
Умовні вирази
Розглядає операції порівняння і логічні оператори, які повертають bool і використовуються для побудови умов.
Конструкція if..else та тернарна операція
Пояснює умовні конструкції if, else, else if та тернарний оператор для вибору різних гілок виконання програми.
Цикли
Описує цикли for, while, do while, foreach, вкладені цикли, а також оператори break і continue.
Масиви
Знайомить із масивами: оголошенням, індексами, довжиною, перебором, багатовимірними та зубчастими масивами.
Завдання з масивами
2.15. Завдання з масивами Опанувавши цикли, умовні конструкції та масиви, розглянемо кілька практичних задач, що відображають типові операції обробки медичних числових даних. Кожна з них демонструє окремий алго
Методи
Пояснює методи як іменовані блоки коду, їх оголошення, виклик, скорочений синтаксис і роль у структуруванні програми.
Параметри методів
Розглядає параметри методів, необов'язкові та іменовані параметри, порядок передачі аргументів і приклади викликів.
Повернення значення та оператор return
Пояснює повернення значень із методів, оператор return, ранній вихід із методу та використання результатів у виразах.
Передача параметрів за посиланням та значенням. Вихідні параметри
Розбирає передачу параметрів за значенням і за посиланням, модифікатори ref, out, in та їх вплив на змінні.
Масив параметрів та ключове слово params
Пояснює масив параметрів params, передачу довільної кількості аргументів і роботу з масивами як параметрами методів.
Рекурсивні функції
Пояснює рекурсію на прикладах факторіалу і чисел Фібоначчі, базовий випадок і ризики нескінченного виклику.
Локальні функції
Розглядає локальні функції всередині методів, їх область видимості, доступ до змінних і статичні локальні функції.
Конструкція switch
Пояснює конструкцію switch/case, default, goto case, повернення значень зі switch і сучасні switch expressions.
Перерахування enum
Розглядає перерахування enum, зберігання стану, іменовані набори значень і зв'язок enum із числовими значеннями.
Питання для самоконтролю
Питання для самоконтролю — Розділ 2. Основи програмування на C 2.1. Структура програми 1. Що таке top level statements у C 9? Що компілятор додає неявно, коли ви пишете код без класу Program і методу Main ? 2.
03 Класи, структури та простір імен 6 підрозділів
Класи та об'єкти
Вводить поняття класу й об'єкта, поля, методи, створення екземплярів, доступ через крапку та базову організацію власних типів.
Конструктори, ініціалізатори та деконструктори
Пояснює конструктори, перевантаження, this, ланцюжки конструкторів, ініціалізатори об'єктів і деконструктори.
Клас Program та метод Main. Програми верхнього рівня
Пояснює метод Main як точку входу, програми верхнього рівня, неявний клас Program і правила розміщення типів у файлі.
Структури
Розглядає структури як власні типи даних: поля, методи, конструктори, ініціалізатори, значення за замовчуванням і копіювання через with.
Типи значень та типи посилань
Пояснює різницю між типами значень і типами посилань, стеком і купою, копіюванням структур та поведінкою посилальних полів.
Питання для самоконтролю
Питання для самоконтролю — Розділ 3. Класи, структури та простір імен 3.1. Класи та об'єкти 1. Чим відрізняється клас від об'єкта ? Наведіть аналогію з реального життя і поясніть, чому не можна поставити знак р
04 Об'єктно-орієнтоване програмування 11 підрозділів
Успадкування
Пояснює успадкування класів, відношення is-a, доступ до членів базового класу, ключове слово base і порядок виклику конструкторів.
Перетворення типів
Розглядає висхідні та спадні перетворення між класами, ризики downcasting і безпечні перевірки через as та is.
Віртуальні методи та властивості
Пояснює virtual і override, перевизначення методів та властивостей, використання base і заборону перевизначення через sealed.
Приховування методів та властивостей
Показує приховування методів, властивостей, змінних і констант за допомогою ключового слова new.
Відмінність перевизначення та приховування методів
Пояснює різницю між перевизначенням і приховуванням методів, роботу VMT і вибір реалізації під час виконання.
Абстрактні класи та члени класів
Розглядає абстрактні класи, абстрактні методи й властивості, обов'язкову реалізацію в похідних класах і приклад фігур.
Клас System.Object та його методи
Пояснює базовий клас System.Object і методи ToString, GetHashCode, GetType та Equals.
Узагальнення
Пояснює generics: універсальні параметри, типобезпеку, boxing/unboxing, кілька параметрів, статичні поля і узагальнені методи.
Обмеження узагальнень
Розглядає обмеження generics через where, обмеження методів і класів, стандартні class, struct, new() та кілька параметрів.
Наслідування узагальнених типів
Показує різні варіанти наслідування узагальнених класів і перенесення обмежень у похідні типи.
Питання для самоконтролю
Питання для самоконтролю — Розділ 4. Об'єктно орієнтоване програмування 4.1. Успадкування 1. Що таке відношення is a ? Чим воно відрізняється від відношення has a ? Наведіть приклад неправильного застосування у
05 Обробка винятків 7 підрозділів
Конструкція try..catch..finally
Пояснює конструкцію try..catch..finally, порядок виконання блоків, аварійне завершення програми та випадки, коли краще використати умовну перевірку.
Блок catch та фільтри винятків
Розглядає форми блоку catch, отримання інформації про виняток через змінну та фільтри винятків із when.
Типи винятків. Клас Exception
Описує базовий клас Exception, його властивості, спеціалізовані типи винятків і порядок розміщення catch-блоків.
Генерація винятку та оператор throw
Пояснює ручну генерацію винятків через throw, передачу повідомлення в Exception і повторне викидання винятку з catch.
Створення класів винятків
Показує створення власних класів винятків, успадкування від Exception або ArgumentException та додавання власних властивостей.
Пошук блоку catch при обробці винятків
Розбирає пошук відповідного catch у стеку викликів і порядок виконання finally при передачі винятку між методами.
Питання для самоконтролю
Питання для самоконтролю — Розділ 5. Обробка винятків 5.1. Конструкція try..catch..finally 1. Що таке виняток exception у C ? Від якого базового класу успадковуються всі класи винятків? Хто і коли створює об'єк
06 Делегати, події та лямбди 6 підрозділів
Делегати
Пояснює делегати як посилання на методи: оголошення, відповідність сигнатур, списки виклику, Invoke, узагальнені делегати, делегати як параметри та приклад з банківським рахунком.
Лямбди
Розглядає лямбда-вирази як компактний запис анонімних методів: параметри, повернення результату, додавання і видалення дій та передавання лямбд у методи.
Події
Пояснює події в C#: оголошення через event, підписку обробників, додавання і видалення обробників, керування add/remove та передавання даних події.
Коваріантність та контраваріантність делегатів
Пояснює коваріантність і контраваріантність делегатів, їх роботу з похідними й базовими типами та використання in/out в узагальнених делегатах.
Делегати Action, Predicate та Func
Розглядає вбудовані делегати Action, Predicate і Func, а також замикання через локальні функції та лямбда-вирази.
Питання для самоконтролю
Питання для самоконтролю — Розділ 6. Делегати, події та лямбди 6.1. Делегати 1. Що таке делегат у C ? Чим він принципово відрізняється від звичайної змінної типу int або string ? Яке місце займають делегати в к
07 Інтерфейси 8 підрозділів
Визначення інтерфейсів
Вводить поняття інтерфейсу, склад його членів, модифікатори доступу, реалізацію за замовчуванням і додавання інтерфейсу у Visual Studio.
Застосування інтерфейсів
Пояснює застосування інтерфейсів у класах і структурах, реалізацію за замовчуванням, множинну реалізацію та перетворення між класами й інтерфейсами.
Явна реалізація інтерфейсів
Розглядає явну реалізацію інтерфейсів, розмежування однакових методів, модифікатори доступу та зміну реалізації в похідних класах.
Успадкування інтерфейсів
Пояснює успадкування інтерфейсів, приховування методів через new і правила доступності похідних інтерфейсів.
Інтерфейси в узагальненнях
Показує використання інтерфейсів як обмежень узагальнень і визначення узагальнених інтерфейсів з різними типами ідентифікаторів.
Копіювання об'єктів. Інтерфейс ICloneable
Розглядає копіювання об'єктів через ICloneable, поверхневе й глибоке копіювання, а також сортування через IComparable та IComparer.
Коваріантність та контраваріантність узагальнених інтерфейсів
Пояснює коваріантність, контраваріантність і їх поєднання в узагальнених інтерфейсах на прикладах месенджерів.
Питання для самоконтролю
Питання для самоконтролю — Розділ 7. Інтерфейси 7.1. Визначення інтерфейсів 1. Що таке інтерфейс у C ? Чим він принципово відрізняється від класу і від абстрактного класу? Що дозволяє, а що забороняє мати інтер
08 Додаткові можливості ООП у C# 11 підрозділів
Визначення операторів
Пояснює перевантаження операторів у класах і структурах, синтаксис operator, бінарні оператори, оператори порівняння та обмеження.
Визначення інкременту та декременту
Розглядає перевантаження інкременту, декременту, операторів true і false та використання об'єкта як умови.
Перевантаження операцій перетворення типів
Показує перевантаження явних і неявних перетворень типів між примітивними та власними складними типами.
Індексатори
Пояснює індексатори, доступ до об'єктів за індексом, рядкові індекси, кілька параметрів, блоки get/set і перевантаження індексаторів.
Змінні-посилання та повернення посилання
Розглядає ref local, повернення посилання з методу, зміну значення через посилання та обмеження для ref return.
Методи розширення
Показує методи розширення, їх синтаксис через this у першому параметрі та правила дії в межах простору імен.
Часткові класи та методи
Пояснює часткові класи й методи, рознесення одного класу між кількома файлами та обмеження partial-методів.
Анонімні типи
Розглядає анонімні типи, ініціалізатори об'єктів, проекційні ініціалізатори, read-only властивості та масиви анонімних об'єктів.
Кортежі
Пояснює кортежі в C#: доступ через Item, іменовані поля, декомпозицію, обмін значеннями, повернення й передачу кортежів у методах.
Records
Розглядає records у C#: record-класи й record-структури, init-властивості, порівняння за значенням, оператор with, позиційні records і успадкування.
Питання для самоконтролю
Питання для самоконтролю — Розділ 8. Додаткові можливості ООП у C 8.1. Визначення операторів 1. Що таке перевантаження операторів у C ? Яку проблему воно вирішує? Поясніть на прикладі, чому код if tempAfter tem
09 Pattern matching 7 підрозділів
Патерн типів
Пояснює type pattern у C#: перевірку типу через is, зіставлення з константами, null-перевірку, switch і додаткові умови через when.
Патерн властивостей
Розглядає property pattern: зіставлення за значеннями властивостей, switch expression, змінні в патернах і вкладені властивості об'єктів.
Патерни кортежів
Показує tuple patterns у switch expression: зіставлення кількох значень кортежу, пропуск елементів через _ і комбінування умов.
Позиційний патерн
Пояснює positional pattern для типів із деконструктором: зіставлення об'єкта за позиціями та використання отриманих значень у результаті.
Реляційний та логічний патерни
Розглядає relational і logical patterns: порівняння через <, <=, комбінування умов через and/or та заперечення через not.
Патерни списків
Пояснює list patterns: повний збіг зі списками й масивами, підстановку _, slice-патерн .., отримання елементів у змінні та поєднання з властивостями колекцій.
Питання для самоконтролю
Питання для самоконтролю — Розділ 9. Pattern matching 9.1. Патерн типів 1. Що таке pattern matching у C і яку проблему він вирішує порівняно зі старим підходом через is + явний cast? 2. Що виведе наступний код
10 Колекції 9 підрозділів
Список List<T>
Пояснює колекцію List<T>: створення списків, ініціалізацію, ємність, індексований доступ, перебір, основні методи додавання, видалення, пошуку, копіювання та розвороту елементів.
Двозв'язаний список LinkedList<T>
Пояснює LinkedList<T> як двозв'язаний список: створення колекції, вузли LinkedListNode<T>, властивості First і Last, прохід у двох напрямках та методи додавання і видалення вузлів.
Черга Queue<T>
Пояснює Queue<T> як FIFO-чергу: створення, ємність, перебір, Count, Enqueue, Dequeue, Peek, безпечні TryDequeue і TryPeek та приклад черги пацієнтів.
Stack<T>
Пояснює Stack<T> як LIFO-стек: створення, перебір у зворотному порядку, Push, Pop, Peek, безпечні TryPop і TryPeek та схему роботи стеку.
Словник Dictionary<K, V>
Пояснює Dictionary<K,V>: пари ключ-значення, ініціалізацію, KeyValuePair, перебір, доступ за ключем, додавання, видалення та перевірку наявності елементів.
Клас ObservableCollection<T>
Пояснює ObservableCollection<T>: створення, індексований доступ, перебір, базові методи колекції та подію CollectionChanged для реагування на додавання, видалення й заміну елементів.
Інтерфейси IEnumerable<T> та IEnumerator<T>
10.7. Інтерфейси IEnumerable<T та IEnumerator<T Щоразу, коли ви пишете foreach var p in ward , C виконує певний контракт — звертається до колекції через стандартизовані інтерфейси. Цей контракт описується двома
Ітератори та yield return
10.8. Ітератори та yield return У розділі 10.7 ми побачили, що для реалізації IEnumerable<T необхідно або написати окремий клас перелічувач IEnumerator<T , або скористатися yield return у тілі GetEnumerator . Д
Питання для самоконтролю
Питання для самоконтролю — Розділ 10. Колекції 10.1. Список List<T 1. Що таке List<T з точки зору внутрішньої реалізації? Поясніть різницю між Count і Capacity . Що відбувається, коли Count досягає Capacity ? 2
11 Робота з рядками 6 підрозділів
Рядки та клас String
Вводить рядки та клас String: створення рядків, конструктори, доступ до символів через індексатор, перебір, порівняння за значенням і перелік основних методів.
Операції з рядками
Пояснює операції з рядками: конкатенацію, Join, Compare, пошук через IndexOf і EndsWith, Split, Trim, Substring, Insert, Remove, Replace та зміну регістру.
Форматування та інтерполяція рядків
Пояснює форматування та інтерполяцію рядків: плейсхолдери, string.Format, специфікатори валюти, чисел, відсотків, настроювані формати, ToString і вирівнювання.
Клас StringBuilder
Розглядає StringBuilder як динамічний рядок: створення, ToString, Length, Capacity, Append, Insert, Replace, Remove і випадки, коли варто обирати String або StringBuilder.
Регулярні вирази
Пояснює регулярні вирази в .NET: клас Regex, Matches, Match, RegexOptions, базовий синтаксис шаблонів, перевірку через IsMatch і заміну через Replace.
Питання для самоконтролю
Питання для самоконтролю — Розділ 11. Робота з рядками 11.1. Рядки та клас String 1. Що означає незмінність immutability рядків у C ? Що насправді відбувається при виклику diagnosis.ToUpper — повертається зміне
12 Робота з датами та часом 6 підрозділів
Структура DateTime
Пояснює DateTime: створення дат і часу, MinValue, Now, UtcNow, Today, григоріанський календар, додавання й віднімання дат та стандартні формати виведення.
Налаштування формату часу та дати
Показує, як задавати власний формат дати й часу для DateTime через описувачі на кшталт hh:mm:ss і dd.MM.yyyy.
DateOnly та TimeOnly
Розглядає DateOnly і TimeOnly у .NET 6: конструктори, властивості, методи додавання, перетворення з DateTime, Parse, TryParse і форматоване виведення.
Структура TimeSpan
12.4. Структура TimeSpan Якщо DateTime відповідає на питання « коли? » конкретна точка в часі , то TimeSpan відповідає на питання « скільки? » тривалість інтервалу . Наприклад: скільки тривала госпіталізація? Ч
DateTimeOffset та часові пояси
12.5. DateTimeOffset та часові пояси Медичні інформаційні системи дедалі частіше є розподіленими: сервери можуть знаходитися в різних часових поясах, пацієнти проходять лікування в різних країнах, телемедичні к
Питання для самоконтролю
Питання для самоконтролю — Розділ 12. Робота з датами та часом 12.1. Структура DateTime 1. Що таке DateTime з точки зору системи типів .NET — клас чи структура? Які наслідки це має для присвоєння та порівняння
13 Додаткові класи та структури .NET 7 підрозділів
Відкладена ініціалізація та тип Lazy<T>
Пояснює відкладену ініціалізацію через Lazy<T>: створення об'єкта тільки в момент першого звернення до Value і економію пам'яті для не використаних залежностей.
Клас Math
Розглядає статичний клас Math з клінічним контекстом: константи PI/E/Tau, чотири методи округлення (Floor, Ceiling, Truncate, Round з банківським заокругленням і MidpointRounding), Abs/Sign/Clamp/Min/Max, Pow/Sqrt/Cbrt, логарифми, тригонометрія, double.IsFinite — runnable приклади ІМТ та порівняння всіх варіантів округлення.
Клас Convert
Розглядає Parse/TryParse (CultureInfo.InvariantCulture для дробових чисел), клас Convert: різниця між оператором cast і Convert.ToInt32 (Truncate vs банківське округлення), числові перетворення, рядки/null, булеві значення, Base64 для медичних даних (HL7 FHIR, DICOM), Convert.ChangeType для динамічного коду.
Клас Array
Пояснює клас Array з клінічним контекстом (Patient struct): Sort з лямбдою і паралельне сортування двох масивів, IndexOf/BinarySearch (відрізняються алгоритмом пошуку), Find/FindAll/Exists/TrueForAll, Copy/Clone (shallow copy нюанс), Resize (виділяє нову пам'ять), Fill/Clear — runnable приклади сортування та пошуку пацієнтів.
Span<T> та ReadOnlySpan<T>
Розглядає Span і ReadOnlySpan як подання ділянки пам'яті без зайвого копіювання: створення з масиву, Slice, спільні дані, основні методи й обмеження ref struct.
Індекси та діапазони (Index та Range)
Пояснює індекси й діапазони C# 8.0: типи Index і Range, оператор ^ для доступу з кінця, оператор .. для підмасивів та застосування зі Span.
Питання для самоконтролю
Питання для самоконтролю — Розділ 13. Додаткові класи та структури .NET 13.1. Відкладена ініціалізація та тип Lazy<T 1. Що таке «відкладена ініціалізація» lazy initialization і яку проблему вона вирішує порівня
14 Рефлексія 7 підрозділів
Введення у рефлексію. Клас System.Type
Вводить поняття рефлексії, простір імен System.Reflection, основні класи для дослідження типів і способи отримання System.Type через typeof, GetType та Type.GetType.
Застосування рефлексії та дослідження типів
Показує дослідження компонентів типу через GetMembers, MemberInfo і BindingFlags, отримання публічних, непублічних та конкретних членів класу.
Дослідження методів та конструкторів за допомогою рефлексії
Розглядає MethodInfo, ParameterInfo і ConstructorInfo: отримання методів, параметрів і конструкторів, BindingFlags та виклик методів через Invoke.
Дослідження полів та властивостей за допомогою рефлексії
Показує дослідження полів і властивостей через FieldInfo та PropertyInfo: GetFields, GetField, GetProperties, читання й зміна приватних полів та властивостей.
Динамічне завантаження збірок та пізнє зв'язування
Розглядає Assembly.LoadFrom, Assembly.Load, отримання типів зі збірки, пізнє зв'язування та виклик статичних методів із завантаженої DLL через рефлексію.
Атрибути у .NET
Пояснює атрибути .NET: створення власного Attribute, застосування до класу, отримання через GetCustomAttributes і обмеження цілей через AttributeUsage.
Питання для самоконтролю
Питання для самоконтролю — Розділ 14. Рефлексія 14.1. Введення у рефлексію. Клас System.Type 1. Що таке рефлексія і що робить її можливою у .NET? Чому збірки .dll і .exe містять не лише IL код, але й метадані?
15 Багатопоточність 8 підрозділів
Введення у багатопоточність. Клас Thread
15.1. Введення у багатопоточність. Клас Thread Сучасні програми рідко виконуються суворо послідовно: одна задача за одною. У реальних системах паралельно відбуваються десятки операцій — обробляються запити, зчи
Створення потоків. ThreadStart та ParameterizedThreadStart
15.2. Створення потоків. ThreadStart та ParameterizedThreadStart Будь який потік у .NET починається з делегата — посилання на метод, який потік виконуватиме. Конструктор класу Thread приймає делегат однієї з дв
Синхронізація потоків. Оператор lock та клас Lock
15.3. Синхронізація потоків. Оператор lock та клас Lock Коли кілька потоків одночасно звертаються до спільних даних — читають, модифікують, записують — виникає фундаментальна проблема: стан перегонів race condi
Клас Monitor
15.4. Клас Monitor Оператор lock — це зручна синтаксична обгортка над класом System.Threading.Monitor . Кожен lock блок компілятор перетворює на виклики Monitor.Enter і Monitor.Exit у блоці try/finally . Тобто
Клас AutoResetEvent
15.5. Клас AutoResetEvent Monitor.Wait і Monitor.Pulse — потужні інструменти координації, але вони вимагають, щоб і виробник, і споживач використовували один і той самий об'єкт замку . У складніших сценаріях, д
Клас Mutex
15.6. Клас Mutex Mutex від англ. mutual exclusion — взаємне виключення — примітив синхронізації, що схожий на lock , але має ключову відмінність: Mutex може працювати між процесами , а не лише між потоками одно
Клас Semaphore та SemaphoreSlim
15.7. Клас Semaphore та SemaphoreSlim Mutex і lock реалізують принцип «один доступ одночасно»: лише один потік може захопити ресурс. Але що, якщо ресурс допускає обмежений паралелізм ? Наприклад, в лікарні є 3
Питання для самоконтролю
Питання для самоконтролю — Розділ 15. Багатопоточність 15.1. Введення у багатопоточність. Клас Thread 1. Що таке процес і що таке потік? Яке ключове ресурсне розмежування між ними? Чому кілька потоків одного пр
16 Паралельне програмування та TPL 6 підрозділів
Клас Task. Основи TPL
16.1. Клас Task. Основи TPL У попередньому розділі ми розглядали багатопоточність через клас Thread — прямий, але низькорівневий інструмент. Ми вручну створювали потоки, передавали делегати, викликали Join , пі
Вкладені завдання та масиви завдань. Task<T>
16.2. Вкладені завдання та масиви завдань. Task<T Розглянемо можливості TPL, що дозволяють будувати складніші структури завдань: вкладені завдання, масиви завдань з колективним очікуванням і типізовані завдання
Продовження завдань. ContinueWith
16.3. Продовження завдань. ContinueWith Завдання продовження continuation task — це завдання, яке автоматично запускається після завершення іншого завдання. Це ключовий механізм побудови послідовних ланцюгів об
Клас Parallel
16.4. Клас Parallel Клас System.Threading.Tasks.Parallel надає зручні статичні методи для паралельного виконання операцій, не вимагаючи явного створення і управління завданнями. Він автоматично розподіляє робот
Скасування завдань. CancellationToken
16.5. Скасування завдань. CancellationToken У реальних системах завдання нерідко потрібно зупинити достроково: користувач натиснув «Скасувати», сплив тайм аут, виникла аварійна ситуація або система перевантажен
Питання для самоконтролю
Питання для самоконтролю — Розділ 16. Паралельне програмування та TPL 16.1. Клас Task. Основи TPL 1. Що таке TPL і яку проблему вона вирішує порівняно з прямим використанням класу Thread ? Поясніть концепцію пу
17 Асинхронне програмування 7 підрозділів
async та await. Асинхронні методи
17.1. async та await. Асинхронні методи Асинхронне програмування — один з найважливіших концептів сучасної розробки програмного забезпечення. Щоб зрозуміти, навіщо воно існує, почнімо з проблеми, яку воно виріш
Типи повернення async-методів
17.2. Типи повернення async методів Асинхронні методи в C можуть повертати чотири типи: void , Task , Task<T і ValueTask<T . Вибір між ними — не питання смаку: кожен тип має своє призначення, обмеження та вплив
Послідовне та паралельне виконання. Task.WhenAll та Task.WhenAny
17.3. Послідовне та паралельне виконання. Task.WhenAll та Task.WhenAny У реальних асинхронних системах рідко виникає потреба виконати лише одну операцію. Зазвичай потрібно координувати кілька: завантажити кільк
Обробка помилок в async-методах
17.4. Обробка помилок в async методах Асинхронний код вимагає особливої уваги до обробки помилок. Виняток, кинутий у асинхронному методі, не поширюється миттєво — він «консервується» у Task і чекає, поки хтось
Скасування async-операцій. CancellationToken
17.5. Скасування async операцій. CancellationToken Скасування — невід'ємна частина асинхронного програмування. Користувач натискає «Скасувати», сплив тайм аут, програма завершує роботу — у всіх цих випадках пот
Асинхронні потоки. IAsyncEnumerable<T>
17.6. Асинхронні потоки. IAsyncEnumerable<T Класичний async Task<T відповідає на одне питання: «дай мені результат асинхронно». Але що, якщо результатів багато і вони надходять поступово — рядки з великого файл
Питання для самоконтролю
Питання для самоконтролю — Розділ 17. Асинхронне програмування 17.1. async та await. Асинхронні методи 1. Яку проблему вирішує асинхронне програмування? Поясніть, що відбувається з потоком при синхронному очіку
18 Робота з файловою системою 6 підрозділів
Класи Path, File та Directory
18.1. Класи Path, File та Directory Файлова система — один із найважливіших механізмів збереження даних у будь якому застосунку. Медична інформаційна система зберігає картки пацієнтів, результати аналізів, знім
Класи FileInfo та DirectoryInfo
18.2. Класи FileInfo та DirectoryInfo У розділі 18.1 ми розглянули статичні класи Path , File та Directory , кожен з яких виконує операцію атомарно: відкрив → зробив → закрив. Це зручно для разових дій, але нее
Stream та FileStream. Потоковий доступ до файлів
18.3. Stream та FileStream. Потоковий доступ до файлів Усі класи File.WriteAllText , File.ReadAllBytes — це зручні обгортки над нижчим рівнем абстракції: потоками streams . Потік — це абстракція послідовного до
StreamReader та StreamWriter. Текстові потоки
18.4. StreamReader та StreamWriter. Текстові потоки FileStream із розділу 18.3 оперує байтами — він не знає нічого про текст, рядки, символи чи кодування. Якщо потрібно читати чи записувати текстові дані, щораз
BinaryReader та BinaryWriter. Бінарні потоки
18.5. BinaryReader та BinaryWriter. Бінарні потоки StreamReader / StreamWriter чудово підходять для текстових даних. Але медичні системи часто мають справу з даними зовсім іншої природи: показники датчиків — по
System.Text.Json. Серіалізація та десеріалізація
18.6. System.Text.Json. Серіалізація та десеріалізація Текстові та бінарні потоки з попередніх розділів вирішують питання як зберегти байти. Але сучасний застосунок рідко оперує сирими байтами — він оперує об'є
18 Файлова система та потоки 1 підрозділів
19 Серіалізація та десеріалізація. JSON та XML 6 підрозділів
System.Text.Json — поглиблено
19.1. System.Text.Json — поглиблено У розділі 18.6 ми розглянули базові операції JsonSerializer.Serialize / Deserialize — достатньо для більшості задач. Але реальні системи стикаються з ситуаціями, де базового
XML-формат та XmlDocument. DOM-модель
19.2. XML формат та XmlDocument. DOM модель XML eXtensible Markup Language — мова розмітки, що описує структуровані дані у вигляді ієрархії тегів. На відміну від JSON, XML підтримує атрибути як першокласний син
XDocument та LINQ to XML
19.3. XDocument та LINQ to XML XmlDocument з'явився у .NET 1.0 і повністю реалізує стандарт DOM рівня 1. Але його API проектувався за зразком Java DOM і є досить багатослівним: щоб додати один елемент, потрібно
XmlReader та XmlWriter. Потоковий XML
19.4. XmlReader та XmlWriter. Потоковий XML XmlDocument і XDocument зручні, але мають спільний недолік: вони завантажують весь XML документ у пам'ять як дерево об'єктів. Для файлу в 10 MB це прийнятно. Для XML
XmlSerializer — атрибутна серіалізація
19.5. XmlSerializer — атрибутна серіалізація XmlSerializer із простору імен System.Xml.Serialization перетворює .NET об'єкти у XML і назад за допомогою атрибутів анотацій прямо на класах та властивостях. Це кла
XPath та вибір між JSON і XML
19.6. XPath та вибір між JSON і XML XPath XML Path Language — мова запитів до XML документа. Вона дозволяє точно адресувати будь який вузол або атрибут через вирази шляхи: /root/child , //descendant , @attribut
19 Серіалізація JSON та XML 1 підрозділів
20 SOLID Принципи 6 підрозділів
Вступ до SOLID. Проблеми без архітектурних принципів
20.1. Вступ до SOLID. Проблеми без архітектурних принципів SOLID — це акронім із п'яти принципів об'єктно орієнтованого проектування, сформульованих Робертом Мартіном Robert C. Martin, відомий у спільноті як «U
SRP — Принцип єдиної відповідальності
20.2. SRP — Принцип єдиної відповідальності Single Responsibility Principle SRP — перший і найфундаментальніший принцип SOLID. Його формулювання звучить коротко: «Клас повинен мати лише одну причину для зміни».
OCP — Принцип відкритості/закритості
20.3. OCP — Принцип відкритості/закритості Open/Closed Principle OCP сформулював Бертран Мейєр Bertrand Meyer у 1988 році, а пізніше переосмислив і популяризував Роберт Мартін. Принцип звучить так: «Програмні с
LSP — Принцип підстановки Ліскова
20.4. LSP — Принцип підстановки Ліскова Liskov Substitution Principle LSP сформулювала Барбара Ліскова Barbara Liskov у 1987 році у доповіді «Data abstraction and hierarchy». Формальне формулювання доволі матем
ISP — Принцип розподілу інтерфейсів
20.5. ISP — Принцип розподілу інтерфейсів Interface Segregation Principle ISP сформулював Роберт Мартін у 1996 році у статті для журналу C++ Report. Принцип звучить так: «Клієнти не повинні залежати від методів
DIP — Принцип інверсії залежностей
20.6. DIP — Принцип інверсії залежностей Dependency Inversion Principle DIP — п'ятий і в певному сенсі найвагоміший принцип SOLID, бо він підсумовує і об'єднує всі попередні. Сформулював його Роберт Мартін у 19
20 Принципи SOLID 1 підрозділів
21 Generic Host та Dependency Injection 5 підрозділів
Generic Host — архітектура та життєвий цикл додатку
21.1. Generic Host — архітектура та життєвий цикл додатку Будь який реальний додаток потребує більше, ніж просто виконання рядків коду зверху вниз. Йому потрібно запуститися, налаштуватись, підключитись до баз
IServiceCollection — реєстрація та розпізнавання сервісів
21.2. IServiceCollection — реєстрація та розпізнавання сервісів У попередньому розділі ми побачили, що Generic Host бере на себе управління lifecycle і надає DI контейнер. Сам контейнер будується в два окремі к
Часи життя сервісів — Singleton, Scoped, Transient
21.3. Часи життя сервісів — Singleton, Scoped, Transient Вибір правильного часу життя сервісу ServiceLifetime — одне з найважливіших архітектурних рішень при роботі з DI контейнером. Неправильний вибір не завжд
Options Pattern — типізована конфігурація з IOptions<T>
21.4. Options Pattern — типізована конфігурація з IOptions<T> Конфігурація — невід'ємна частина будь якого реального додатку. Рядок підключення до бази даних, адреса SMTP сервера, максимальна кількість за
Питання для самоконтролю
Питання для самоконтролю — Розділ 21. Generic Host та Dependency Injection 21.1. Generic Host 1. Назвіть три ролі Generic Host в .NET застосунку. Які проблеми він вирішує порівняно зі стандартним підходом "все