OOP Course
Сьогодні

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

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

Питання для самоконтролю — Розділ 3. Класи, структури та простір імен 3.1. Класи та об'єкти 1. Чим відрізняється клас від об'єкта ? Наведіть аналогію з реального життя і поясніть, чому не можна поставити знак р

Питання для самоконтролю — Розділ 3. Класи, структури та простір імен

3.1. Класи та об'єкти

  1. Чим відрізняється клас від об'єкта? Наведіть аналогію з реального життя і поясніть, чому не можна поставити знак рівності між цими поняттями.

  2. Що відбувається покроково при виконанні рядка Patient patient1 = new Patient();? Опишіть всі три дії, які виконує середовище виконання.

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

    Patient a = new Patient();
    a.Name = "Олена";
    Patient b = a;
    b.Name = "Марія";
    Console.WriteLine(a.Name);
  4. У чому різниця між полем і методом класу? Чому метод може звертатися до полів без додаткових параметрів?

  5. Пояснить різницю між public і private модифікаторами доступу на рівні полів. Чому в реальних проєктах поля роблять приватними?

  6. Що таке null для змінної типу класу? Що станеться, якщо викликати метод через null-посилання, і як цього уникнути?

  7. Напишіть клас Book з полями Title (рядок), Author (рядок), Year (ціле число) і константою MaxTitleLength = 200. Додайте метод Display(), що виводить інформацію про книгу. Створіть масив з трьох книг і виведіть їх у циклі.

  8. Де зберігаються значення полів об'єкта — у стеку чи в купі? Де зберігається змінна, що містить посилання на об'єкт? Чому ця різниця важлива для розуміння семантики присвоєння?


3.2. Конструктори, ініціалізатори та деконструктори

  1. Що станеться, якщо у класі визначити конструктор з параметрами, але не визначити конструктор без параметрів? Чи можна тоді писати new Patient()?

  2. Поясніть синтаксис : this(...) у конструкторі. Який порядок виконання, коли один конструктор делегує іншому?

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

    class Patient
    {
        public string Name;
        public int Age;
        public Patient() : this("Невідомий") {}
        public Patient(string name) : this(name, 0) {}
        public Patient(string name, int age)
        {
            Name = name;
            Age  = age;
            Console.WriteLine($"Patient({name}, {age})");
        }
    }
    Patient p = new Patient();
  4. Чим ініціалізатор об'єкта { field = value } відрізняється від конструктора? Що відбувається першим — конструктор чи ініціалізатор?

  5. Поясніть, для чого потрібен статичний конструктор. Коли він виконується і скільки разів?

  6. Порівняйте ланцюжок конструкторів через this(...) і єдиний конструктор з параметрами за замовчуванням. Коли один підхід кращий за інший?

  7. Що таке деконструктор у C# (метод Deconstruct)? Чим він відрізняється від деструктора? Напишіть клас Point з координатами X і Y, реалізуйте деконструктор і продемонструйте його використання.

  8. Для чого використовується private конструктор? Наведіть приклад патерну Singleton з поясненням, чому він потребує саме приватного конструктора.


3.3. Клас Program та метод Main. Програми верхнього рівня

  1. Що таке точка входу програми в C#? Як CLR знаходить її при запуску?

  2. Що робить компілятор, коли бачить програму верхнього рівня (без явного класу Program і методу Main)? Який еквівалентний код він генерує?

  3. Визначте, що з наступного потрапить усередину методу Main, а що буде поза ним при top-level синтаксисі:

    • оголошення локальної змінної string greeting = "Привіт";
    • оголошення локальної функції void Say(string s) { ... }
    • оголошення класу class Helper { ... }
  4. Яке обмеження існує на порядок розміщення класів і інструкцій у top-level програмі? Що станеться, якщо порушити цей порядок?

  5. У яких ситуаціях доцільно писати явний class Program і static void Main(...), а не покладатися на top-level синтаксис?

  6. Як оголосити точку входу, щоб можна було використовувати await прямо в Main? Що відбувається з top-level програмою, коли в ній вперше зустрічається await?

  7. Чому метод Main завжди оголошується як static? Що це означає стосовно об'єктів?


3.4. Структури

  1. Назвіть ключову відмінність між struct і class з точки зору семантики копіювання. Що відбудеться, якщо присвоїти одну структуру іншій?

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

    BloodPressure bp1 = new BloodPressure { systolic = 120, diastolic = 80 };
    BloodPressure bp2 = bp1;
    bp2.systolic = 145;
    Console.WriteLine(bp1.systolic);
  3. Починаючи з якої версії C# дозволено ініціалізувати поля структури при оголошенні? Що обов'язково потрібно зробити, якщо такі значення визначені?

  4. Поясніть оператор with для структур. Чи змінює він оригінальний об'єкт?

  5. Що таке readonly struct? Яку гарантію вона надає і яка від цього перевага з точки зору продуктивності?

  6. Порівняйте struct і record struct. Що record struct додає автоматично і коли його варто використовувати замість звичайної структури?

  7. Чи може структура мати конструктор без параметрів? Чи була ця можливість завжди доступна? Що відбувається, якщо структура має параметризований конструктор, але не має конструктора без параметрів, і ми пишемо new BloodPressure()?

  8. Спроєктуйте структуру Temperature для зберігання температури тіла (у градусах Цельсія) як readonly struct. Додайте конструктор з параметром і метод IsFever(), що повертає true якщо температура перевищує 37.5.


3.5. Типи значень та типи посилань

  1. Назвіть щонайменше по чотири приклади типів значень і типів посилань у C#. До якої категорії належить string?

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

  3. Що виведе цей код і чому?

    Patient patient1 = new Patient("Іван", 45);
    Patient patient2 = patient1;
    patient2.name = "Марія";
    Console.WriteLine(patient1.name);
  4. Що таке поверхове копіювання (shallow copy)? Наведіть сценарій зі структурою, що містить поле-клас, де поверхове копіювання призводить до несподіваного результату.

  5. Поясніть механізм boxing і unboxing. Які витрати вони спричиняють і чому?

  6. Що станеться при виконанні такого коду?

    int age = 45;
    object boxed = age;
    double wrong = (double)boxed;

    Де виникне помилка — під час компіляції чи виконання? Як це виправити?

  7. Чому List<int> є кращим рішенням ніж ArrayList для зберігання цілих чисел? Яка роль generics у цьому контексті?

  8. Порівняйте поведінку при присвоєнні int b = a та Patient b = a. Поясніть, що саме копіюється у кожному випадку, і намалюйте (або опишіть словами) стан пам'яті після кожного присвоєння.

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