Підрозділ 13.Q
Питання для самоконтролю
Питання для самоконтролю — Розділ 13. Додаткові класи та структури .NET 13.1. Відкладена ініціалізація та тип Lazy<T 1. Що таке «відкладена ініціалізація» lazy initialization і яку проблему вона вирішує порівня
Питання для самоконтролю — Розділ 13. Додаткові класи та структури .NET
13.1. Відкладена ініціалізація та тип `Lazy`
Що таке «відкладена ініціалізація» (lazy initialization) і яку проблему вона вирішує порівняно з «ранньою ініціалізацією» (eager initialization)?
Що таке
Lazy<T>? Коли саме відбувається ініціалізація обгорнутого об'єкта — при створенніLazy<T>чи при першому зверненні до.Value?Що виведе наступний код? Поясніть порядок виконання:
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));Як передати параметри в конструктор об'єкта, що обгортається
Lazy<T>? Напишіть приклад зі лямбда-виразом, де потрібний параметрpatientId.Для чого призначена властивість
IsValueCreated? Назвіть практичний сценарій, де важливо перевірити стан без запуску ініціалізації.Поясніть три режими потокової безпеки
LazyThreadSafetyMode:ExecutionAndPublication,PublicationOnlyіNone. В яких умовах кожен із них є правильним вибором?Спроєктуйте клас
DiagnosticService, у якому словник нормативних значень лабораторних показників завантажується лише при першому зверненні. ВикористайтеLazy<T>зі статичним полем.Порівняйте
Lazy<T>і ручну реалізацію відкладеної ініціалізації черезnull-перевірку:private Library? _lib; public Library Lib => _lib ??= new Library();Яка різниця в поведінці при конкурентному доступі з кількох потоків?
13.2. Клас Math
Чому
Mathєstatic sealed class? Які архітектурні переваги дає таке рішення?Пояснити різницю між
Math.Floor,Math.CeilingіMath.Truncateдля від'ємних чисел. Що виведе наступний код?Console.WriteLine(Math.Floor(-2.7)); Console.WriteLine(Math.Ceiling(-2.1)); Console.WriteLine(Math.Truncate(-2.9));Що таке «банківське заокруглення» і чому
Math.Round(2.5)повертає2, а не3? Як отримати «шкільне» заокруглення для значеньx.5?Що виведе цей код і чому результат може здивувати?
Console.WriteLine(Math.Round(2.5)); Console.WriteLine(Math.Round(3.5)); Console.WriteLine(Math.Round(4.5));Що таке
Math.Clamp(value, min, max)і яку задачу він вирішує? Перепишіть наступний код з використаннямClamp:if (heartRate < 40) heartRate = 40; else if (heartRate > 200) heartRate = 200;Напишіть функцію обчислення ІМТ (BMI = вага / зріст²). Додайте захист від ділення на нуль або некоректних вхідних даних за допомогою
double.IsFinite.Чому
Math.Cbrt(-8)повертає-2, аMath.Pow(-8, 1.0/3.0)повертаєNaN? Що такеNaNі як воно «поширюється» у виразах?Усі тригонометричні функції
Mathприймають аргументи в радіанах. Напишіть вираз для перетворення 45 градусів у радіани і обчисленняsin(45°). Яким повинен бути результат?
13.3. Клас Convert
В чому різниця між
int.Parse(s)іConvert.ToInt32(s)? В яких сценаріях кожен метод є кращим вибором?Що виведе наступний код? Поясніть результат:
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));Чому
Convert.ToInt32(null)повертає0, а не кидаєNullReferenceException? В якому сценарії ця поведінка корисна?Що кине цей код і як правильно його переписати?
string s = "abc"; int val = Convert.ToInt32(s);Що таке Base64-кодування і де воно застосовується у медичній інформатиці (HL7 FHIR)? Напишіть код, який кодує рядок у Base64 і декодує назад.
Порівняйте
Convert.ToString(null)іnull?.ToString(). Яка різниця в результаті? В яких умовах перша форма безпечніша?Що таке
Convert.ChangeType(value, type)і коли він є незамінним? Наведіть приклад сценарію, де тип перетворення відомий лише під час виконання.Який із методів слід використати в кожному сценарії і чому?
- Зчитати вік пацієнта з поля форми (рядок, введений користувачем)
- Конвертувати
boolуintдля збереження у БД - Отримати
DateTimeз рядка невідомого формату - Перетворити
longуintз перевіркою переповнення
13.4. Клас Array
Чому кожен масив
int[]абоstring[]є об'єктом класуSystem.Array? Які властивості це надає будь-якому масиву?Array.Sort(arr)виконує сортування на місці (in-place) — що це означає для вихідного масиву? Як відсортувати масив об'єктів за полемAgeу спадному порядку?В чому різниця між
Array.IndexOfіArray.BinarySearch? Що повернаєBinarySearch, якщо елемент не знайдено, і як це значення інтерпретувати?Що виведе наступний код?
int[] ages = { 38, 45, 52, 67, 71 }; // вже відсортований int result = Array.BinarySearch(ages, 50); Console.WriteLine(result); Console.WriteLine(~result);В чому різниця між
Array.FindіArray.FindAll? Що повертаєFind, якщо умова не виконується жодним елементом?Що таке «поверхнева копія» (shallow copy)? Чим
Array.Copyвідрізняється від.Clone()при роботі з масивами посилальних типів?Що відбувається «під капотом» при виклику
Array.Resize(ref arr, newSize)? Чому параметр обов'язковоref? Які ризики при наявності кількох змінних, що вказують на один масив?Спроєктуйте функцію, яка приймає масив пацієнтів і повертає тільки тих, хто старший за 65 років (масив нащадків). Використайте
Array.FindAll. Потім перевірте черезArray.TrueForAll, чи всі знайдені пацієнти дійсно старші за 65.
13.5. `Span` та `ReadOnlySpan`
Яку проблему вирішує
Span<T>? Чомуstring.Substring()у великих циклах може бути проблематичним?Що означає, що
Span<T>єref struct? Які конкретні обмеження накладає цей факт і чому вони введені?Що виведе наступний код? Чи зміниться оригінальний масив?
int[] data = { 1, 2, 3, 4, 5 }; Span<int> slice = data.AsSpan(1, 3); slice[0] = 99; Console.WriteLine(data[1]);В чому різниця між
Span<T>(змінний) іReadOnlySpan<T>(незмінний)? Чомуstring.AsSpan()повертає самеReadOnlySpan<char>?Поясніть, як
int.TryParse(ReadOnlySpan<char>, out int)дозволяє парсити число без виділення підрядка в heap. Чому це важливо при обробці великих CSV-файлів?Порівняйте парсинг CSV-рядка через
string.Split(",")і через ручне ітерування зReadOnlySpan<char>таIndexOf. Яка різниця в алокаціях пам'яті?Коли слід використовувати
Memory<T>замістьSpan<T>? В яких ситуаціяхSpanтехнічно неможливо застосувати?Напишіть метод
static double Average(ReadOnlySpan<double> values), який обчислює середнє значення без виділення нових об'єктів. Поясніть, чому параметрReadOnlySpan<double>є кращим вибором ніжdouble[].
13.6. Індекси та діапазони (`Index` та `Range`)
Що таке оператор
^у контекстіSystem.Index? Що означає^1,^2і^0? Що станеться приarr[^0]?Що означає оператор
..при роботі з масивами? Чи включає права межа останній елемент?Що виведе наступний код?
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));В чому різниця між
arr[1..4](Range на масиві) іarr.AsSpan()[1..4](Range на Span)? Що відбувається з оригінальним масивом при зміні елемента зрізу в кожному випадку?Чому
list[1..3]не компілюється дляList<T>, алеlist[^1]— компілюється? Як отримати підмножинуList<T>за аналогічною логікою?Як зберегти
Rangeу змінній і передати у метод? Напишіть приклад зRange recentRange = ^5..;і покажіть, як черезGetOffsetAndLengthотримати числові значення.Напишіть код, який розкладає ICD-10 код (наприклад,
"I10.9") на три частини: перша літера, числовий код, і підклас після крапки — використовуючи тільки синтаксис індексів і діапазонів.Порівняйте синтаксис
str[1..^2]таstr.Substring(1, str.Length - 3). Чи еквівалентні вони? Яка версія більш читабельна і менш схильна до помилок «на одиницю»?