OOP Course
Сьогодні

Підрозділ 13.Q

Питання для самоконтролю

Питання для самоконтролю — Розділ 13. Додаткові класи та структури .NET 13.1. Відкладена ініціалізація та тип Lazy<T 1. Що таке «відкладена ініціалізація» lazy initialization і яку проблему вона вирішує порівня

Питання для самоконтролю — Розділ 13. Додаткові класи та структури .NET

13.1. Відкладена ініціалізація та тип `Lazy`

  1. Що таке «відкладена ініціалізація» (lazy initialization) і яку проблему вона вирішує порівняно з «ранньою ініціалізацією» (eager initialization)?

  2. Що таке Lazy<T>? Коли саме відбувається ініціалізація обгорнутого об'єкта — при створенні Lazy<T> чи при першому зверненні до .Value?

  3. Що виведе наступний код? Поясніть порядок виконання:

    Lazy<Library> lib = new Lazy<Library>();
    Console.WriteLine(lib.IsValueCreated);
    var x = lib.Value;
    Console.WriteLine(lib.IsValueCreated);
    var y = lib.Value;
    Console.WriteLine(object.ReferenceEquals(x, y));
  4. Як передати параметри в конструктор об'єкта, що обгортається Lazy<T>? Напишіть приклад зі лямбда-виразом, де потрібний параметр patientId.

  5. Для чого призначена властивість IsValueCreated? Назвіть практичний сценарій, де важливо перевірити стан без запуску ініціалізації.

  6. Поясніть три режими потокової безпеки LazyThreadSafetyMode: ExecutionAndPublication, PublicationOnly і None. В яких умовах кожен із них є правильним вибором?

  7. Спроєктуйте клас DiagnosticService, у якому словник нормативних значень лабораторних показників завантажується лише при першому зверненні. Використайте Lazy<T> зі статичним полем.

  8. Порівняйте Lazy<T> і ручну реалізацію відкладеної ініціалізації через null-перевірку:

    private Library? _lib;
    public Library Lib => _lib ??= new Library();

    Яка різниця в поведінці при конкурентному доступі з кількох потоків?


13.2. Клас Math

  1. Чому Math є static sealed class? Які архітектурні переваги дає таке рішення?

  2. Пояснити різницю між Math.Floor, Math.Ceiling і Math.Truncate для від'ємних чисел. Що виведе наступний код?

    Console.WriteLine(Math.Floor(-2.7));
    Console.WriteLine(Math.Ceiling(-2.1));
    Console.WriteLine(Math.Truncate(-2.9));
  3. Що таке «банківське заокруглення» і чому Math.Round(2.5) повертає 2, а не 3? Як отримати «шкільне» заокруглення для значень x.5?

  4. Що виведе цей код і чому результат може здивувати?

    Console.WriteLine(Math.Round(2.5));
    Console.WriteLine(Math.Round(3.5));
    Console.WriteLine(Math.Round(4.5));
  5. Що таке Math.Clamp(value, min, max) і яку задачу він вирішує? Перепишіть наступний код з використанням Clamp:

    if (heartRate < 40) heartRate = 40;
    else if (heartRate > 200) heartRate = 200;
  6. Напишіть функцію обчислення ІМТ (BMI = вага / зріст²). Додайте захист від ділення на нуль або некоректних вхідних даних за допомогою double.IsFinite.

  7. Чому Math.Cbrt(-8) повертає -2, а Math.Pow(-8, 1.0/3.0) повертає NaN? Що таке NaN і як воно «поширюється» у виразах?

  8. Усі тригонометричні функції Math приймають аргументи в радіанах. Напишіть вираз для перетворення 45 градусів у радіани і обчислення sin(45°). Яким повинен бути результат?


13.3. Клас Convert

  1. В чому різниця між int.Parse(s) і Convert.ToInt32(s)? В яких сценаріях кожен метод є кращим вибором?

  2. Що виведе наступний код? Поясніть результат:

    double d = 3.9;
    Console.WriteLine((int)d);
    Console.WriteLine(Convert.ToInt32(d));
    
    double half = 2.5;
    Console.WriteLine((int)half);
    Console.WriteLine(Convert.ToInt32(half));
  3. Чому Convert.ToInt32(null) повертає 0, а не кидає NullReferenceException? В якому сценарії ця поведінка корисна?

  4. Що кине цей код і як правильно його переписати?

    string s = "abc";
    int val = Convert.ToInt32(s);
  5. Що таке Base64-кодування і де воно застосовується у медичній інформатиці (HL7 FHIR)? Напишіть код, який кодує рядок у Base64 і декодує назад.

  6. Порівняйте Convert.ToString(null) і null?.ToString(). Яка різниця в результаті? В яких умовах перша форма безпечніша?

  7. Що таке Convert.ChangeType(value, type) і коли він є незамінним? Наведіть приклад сценарію, де тип перетворення відомий лише під час виконання.

  8. Який із методів слід використати в кожному сценарії і чому?

    • Зчитати вік пацієнта з поля форми (рядок, введений користувачем)
    • Конвертувати bool у int для збереження у БД
    • Отримати DateTime з рядка невідомого формату
    • Перетворити long у int з перевіркою переповнення

13.4. Клас Array

  1. Чому кожен масив int[] або string[] є об'єктом класу System.Array? Які властивості це надає будь-якому масиву?

  2. Array.Sort(arr) виконує сортування на місці (in-place) — що це означає для вихідного масиву? Як відсортувати масив об'єктів за полем Age у спадному порядку?

  3. В чому різниця між Array.IndexOf і Array.BinarySearch? Що повернає BinarySearch, якщо елемент не знайдено, і як це значення інтерпретувати?

  4. Що виведе наступний код?

    int[] ages = { 38, 45, 52, 67, 71 }; // вже відсортований
    int result = Array.BinarySearch(ages, 50);
    Console.WriteLine(result);
    Console.WriteLine(~result);
  5. В чому різниця між Array.Find і Array.FindAll? Що повертає Find, якщо умова не виконується жодним елементом?

  6. Що таке «поверхнева копія» (shallow copy)? Чим Array.Copy відрізняється від .Clone() при роботі з масивами посилальних типів?

  7. Що відбувається «під капотом» при виклику Array.Resize(ref arr, newSize)? Чому параметр обов'язково ref? Які ризики при наявності кількох змінних, що вказують на один масив?

  8. Спроєктуйте функцію, яка приймає масив пацієнтів і повертає тільки тих, хто старший за 65 років (масив нащадків). Використайте Array.FindAll. Потім перевірте через Array.TrueForAll, чи всі знайдені пацієнти дійсно старші за 65.


13.5. `Span` та `ReadOnlySpan`

  1. Яку проблему вирішує Span<T>? Чому string.Substring() у великих циклах може бути проблематичним?

  2. Що означає, що Span<T> є ref struct? Які конкретні обмеження накладає цей факт і чому вони введені?

  3. Що виведе наступний код? Чи зміниться оригінальний масив?

    int[] data = { 1, 2, 3, 4, 5 };
    Span<int> slice = data.AsSpan(1, 3);
    slice[0] = 99;
    Console.WriteLine(data[1]);
  4. В чому різниця між Span<T> (змінний) і ReadOnlySpan<T> (незмінний)? Чому string.AsSpan() повертає саме ReadOnlySpan<char>?

  5. Поясніть, як int.TryParse(ReadOnlySpan<char>, out int) дозволяє парсити число без виділення підрядка в heap. Чому це важливо при обробці великих CSV-файлів?

  6. Порівняйте парсинг CSV-рядка через string.Split(",") і через ручне ітерування з ReadOnlySpan<char> та IndexOf. Яка різниця в алокаціях пам'яті?

  7. Коли слід використовувати Memory<T> замість Span<T>? В яких ситуаціях Span технічно неможливо застосувати?

  8. Напишіть метод static double Average(ReadOnlySpan<double> values), який обчислює середнє значення без виділення нових об'єктів. Поясніть, чому параметр ReadOnlySpan<double> є кращим вибором ніж double[].


13.6. Індекси та діапазони (`Index` та `Range`)

  1. Що таке оператор ^ у контексті System.Index? Що означає ^1, ^2 і ^0? Що станеться при arr[^0]?

  2. Що означає оператор .. при роботі з масивами? Чи включає права межа останній елемент?

  3. Що виведе наступний код?

    int[] arr = { 10, 20, 30, 40, 50 };
    int[] a = arr[1..^1];
    int[] b = arr[^3..];
    Console.WriteLine(string.Join(", ", a));
    Console.WriteLine(string.Join(", ", b));
  4. В чому різниця між arr[1..4] (Range на масиві) і arr.AsSpan()[1..4] (Range на Span)? Що відбувається з оригінальним масивом при зміні елемента зрізу в кожному випадку?

  5. Чому list[1..3] не компілюється для List<T>, але list[^1] — компілюється? Як отримати підмножину List<T> за аналогічною логікою?

  6. Як зберегти Range у змінній і передати у метод? Напишіть приклад з Range recentRange = ^5..; і покажіть, як через GetOffsetAndLength отримати числові значення.

  7. Напишіть код, який розкладає ICD-10 код (наприклад, "I10.9") на три частини: перша літера, числовий код, і підклас після крапки — використовуючи тільки синтаксис індексів і діапазонів.

  8. Порівняйте синтаксис str[1..^2] та str.Substring(1, str.Length - 3). Чи еквівалентні вони? Яка версія більш читабельна і менш схильна до помилок «на одиницю»?

Розроблено Tomka Yurii · © 2026 ·