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




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


Зміст


Пошук на інших ресурсах:

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

Структури відносяться до типів-значень (value type). Це означає, що вони неявно успадковані від класу System.ValueType. До типів-значення (структурних типів) відносяться базові (примітивні) типи даних такі як short, int, uint, double, float, bool та інші, а також їхні псевдоніми System.Int32, System.Double, System.Single та інші.

Класи відносяться до посилальних типів (reference type).

З точки зору розміщення в пам’яті, між структурами та класами існує наступна відмінність.

Якщо оголошується змінна (екземпляр) типу структури, то цей екземпляр розміщується в стеку повністю. Час життя структури визначається контекстом, в якому вона визначена. Як тільки змінна типу структури виходить за межі контексту, в якому вона визначена, то вона одразу ж видаляється з пам’яті.

Якщо оголошується змінна (посилання) типу класу, то в стеку розміщується тільки посилання на екземпляр класу. Сам екземпляр розміщується в області пам’яті, що називається “куча” (heap). Щоб створити екземпляр класу, потрібно обов’язково використовувати оператор new. Знищенням екземпляру класу з пам’яті займається збирач сміття (Garbage collector).

 

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#?

Усі структури неявно успадковують клас System.ValueType, який успадкований від System.Object.

 

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

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

 

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

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

 


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