Структури. Загальні поняття. Тип структури. Структурна змінна. Модифікатори доступу до структурної змінної. Приклади використання структур в різних частинах програми

Структури. Загальні поняття. Тип структури. Структурна змінна. Модифікатори доступу до структурної змінної. Приклади використання структур в різних частинах програми


Зміст



1. Що таке структура в мові C#? Призначення структур

Часто, при написанні програм, що містять різноманітні дані, виникає необхідність групування цих даних за деяким критерієм. Таке групування є необхідним для покращення наочності програмного коду, що в свою чергу призводить до зменшення помилок та підвищення продуктивності праці програміста.
Доступ до згрупованих даних спрощує використання імен у програмі. Дані групуються відповідно до проблемної області, для якої розробляється програма.

У мові програмування C#, з метою зручного групування даних, використовуються так звані структури.

Використання структури у програмі відбувається у 2 етапи:

  • оголошення типу структури;
  • оголошення структурної змінної.

 

2. Яка загальна форма оголошення структури (структурного типу)? Ключове слово struct

Загальна форма оголошення типу структури:

struct ім’я_типу_структури : інтерфейси
{
    // оголошення членів та методів структури
    // ...
}

де

  • ім’я_типу_структури – назва структурного типу на основі якого будуть оголошуватись об’єкти (змінні, екземпляри структури);
  • інтерфейси – перелік інтерфейсів, методи яких потрібно реалізувати в тілі структури.

 

3. Приклад оголошення структури, що описує інформацію про студента

Нехай потрібно сформувати базу даних студентів навчального закладу. Дані про студентів у базі даних можна представити структурами. У найпростішому випадку кожна структура повинна об’єднувати такі дані:

  • прізвище студента;
  • ім’я студента;
  • рік вступу до навчального закладу;
  • рік народження;
  • адреса проживання;
  • номер залікової;
  • поточний рейтинг студента.

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

struct Student
{
    public string name; // прізвище
    public string surname; // ім'я
    public int year; // рік вступу до навчального закладу
    public int birth_year; // рік народження
    public string address; // адреса проживання
    public string book_number; // номер залікової
    public float rank; // рейтинг
}

 

4. Що таке структурна змінна? Як виділяється пам’ять для структурної змінної? Приклад оголошення, ініціалізації та використання структурної змінної

Нехай дано оголошення структурної змінної, що описує один запис в телефонному довіднику:

struct Telephone
{
    public string number; // номер телефону
    public string name; // ім'я абонента
    public string surname; // прізвище абонента
    public string address; // адреса
    public int code; // поштовий код
}

Оголошення та використання структурної змінної типу Telephone буде таким:

// Оголошення структурної змінної з іменем T1 типу Telephone
Telephone T1;

// заповнення полів структурної змінної T1
T1.name = "Johnson";
T1.surname = "John";
T1.number = "77777777";
T1.code = 89300;
T1.address = "Boston";

 

5. Який тип доступу за замовчуванням мають поля структурної змінної? Приклади

За замовчуванням, поля структурної змінної мають тип доступу private. Щоб можна було доступитись до полів структурної змінної безпосередньо, використовується ключове слово public.

Приклад 1. Нехай дано оголошення структури, що описує інформацію про студента:

struct Student
{
    string name; // прізвище
    string surname; // ім'я
    int year; // рік вступу до навчального закладу
    int birth_year; // рік народження
    string address; // адреса проживання
    string book_number; // номер залікової
    float rank; // рейтинг
}

У даній структурі усі члени не мають явно заданого модифікатору доступу (private, public). За замовчуванням, встановлюється модифікатор доступу private. Це означає, що при оголошенні змінної типу Student, неможливо буде доступитись до полів структури безпосередньо. Тобто такий програмний код буде помилковий:

Student St;
St.name = "Name of student"; // помилка!
St.year = 1990; // помилка!

Приклад 2. Нехай дано оголошення типу структури, що містить інформацію про дату (рік, місяць, число):

struct Date
{
    public int day; // число
    public int month; // місяць
    public int year; // рік
}

Тоді, використання структури у деякому методі може бути таким:

// використання структурної змінної в коді деякого методу
Date D; // оголошення змінної з іменем D типу структури Date

// заповнення полів структурної змінної
// поля оголошені як public
D.day = 14;
D.month = 1;
D.year = 1972;

 

6. У яких частинах програмного коду можна оголошувати структуру та структурну змінну для Windows Forms додатків?

Для додатків, створених за шаблоном Windows Forms Application тип структури можна оголошувати:

  • у межах простору імен але за межами класу;
  • у межах класу але за межами методів класу.

У методі класу оголосити тип структури не вдасться.
Структурну змінну можна оголошувати в класі як в методах класу, так і за межами методів класу.

 

7. Яка відмінність між структурою і класом з точки зору їх представлення в пам’яті?

Структури відносяться до типів значення. Це означає, що пам’ять для змінних типу структура виділяється одразу при їх оголошенні. До типів значення відносяться і базові типи даних такі як short, int, uint, double, float, bool, string та інші. Доступ до полів структури виконується безпосередньо.
Виділяти пам’ять для структурної змінної з допомогою оператора new необов’язково (але можна).

Класи відносяться до типів посилання. Це означає, що для об’єкту класу (змінної типу “клас”) обов’язково потрібно виділяти пам’ять з допомогою оператора new.

 

8. Які існують відмінності між структурами і класами?

При використанні структур і класів, можна виділити такі основні відмінності:

  • структури належать до типів значень, класи належать до типів посилання;
  • при присвоюванні структур створюється повна копія її об’єкта, тобто виділяється додатково пам’ять для додаткової структури. При присвоюванні класів посилання на один клас присвоюється посиланню на другий клас і, як результат, обидва посилання вказують на той самий об’єкт;
  • структури не підтримують спадковість. Структура не може успадковувати клас або іншу структуру. Однак, структура може містити змінну структурного типу;
  • на відміну від класів, у структурах не можна оголошувати (реалізовувати) конструктор за замовчуванням;
  • на відміну від класів, у структурах члени даних не можуть бути оголошені з ключовим словом protected, оскільки структури не підтримують спадковість;
  • на відміну від класів, структури не підтримують деструкторів;
  • структури не можуть оголошуватись з ключовими словами abstract та virtual.

 

9. У яких випадках доцільніше використовувати структури ніж класи?

Хоча структури володіють меншим потенціалом ніж класи, в деяких випадках використання структур є більш ефективним. До таких випадків можна віднести випадки:

  • коли потрібно зберегти групу даних (згрупувати дані), які не потребують спадковості і доступу за посиланням;
  • коли потрібно підвищити продуктивність роботи (швидкість доступу) та забезпечити економію пам’яті, що виділяється для даних, які не вимагають спадковості. Це зв’язано з тим, що структури належать до типів-значень, а, отже, ними можна оперувати безпосередньо;
  • коли потрібно обробляти групи даних в масиві, для якого кількість елементів є фіксованою і відносно невеликою.

Структури є більш зручними для групування невеликих об’ємів даних.

 

10. Які елементи мови програмування можна реалізовувати у структурі?

В структурі можна реалізовувати:

  • поля (члени даних структури);
  • методи;
  • інтерфейси;
  • індексатори;
  • властивості;
  • операторні методи;
  • події;
  • конструктори (крім конструктора за замовчуванням).

 

11. Чи можна створювати об’єкт структури з допомогою оператора new?

Можна. У цьому випадку після ключового слова new викликається конструктор за замовчуванням.

Наприклад. Використання оператора new для створення екземпляру структури типу Date.

// Структура, що описує дату
struct Date
{
    public int day;
    public int month;
    public int year;
}

Демонстрація використання структури типу Date:

// створення екземпляру структури з допомогою оператора new
Date D = new Date(); // викликається конструктор за замовчуванням

// заповнити поля структури даними
D.day = 14;
D.month = 01;
D.year = 1972;

 

12. Чи підтримують структури спадковість?

На відміну від класів, структури спадковість не підтримують.

 

13. Який один базовий клас успадковують структури в C#?

Усі структури успадковують клас object. Інші класи чи структури не можуть бути успадковані структурами.

 

14. Чи можуть поля (члени) структури оголошуватись з ключовим словом protected?

Не можуть, оскільки структури не підтримують спадковість.

 

15. Чи можуть поля (члени) структури оголошуватись з ключовими словами abstract та virtual?

Не можуть, оскільки структури не підтримують спадковість.

 


Зв’язані теми