Попередня сторінка          Зміст           Наступна сторінка          Електронні посібники ВНТУ

 

ЛАБОРАТОРНА РОБОТА № 5

СТРУКТУРИ, РОЗШИРЕННЯ СТРУКТУР

 

 

Мета: опис поняття та використання структур, робота зі створення та розширення структур.

 

5.1 Теоретичні відомості

 

5.1.1 Структури

В C# структура – це програмна конструкція, яку можна використовувати для визначення типу користувачем. Це по суті структура даних, що представляє собою пов'язані фрагменти інформації в якості окремої сутності. Наприклад:

  •  структура, що називається Point, може складатися з полів для задання х-координати та у-координати.
  •  структура, що називається Circle, може складатися з полів для представлення координати х, координати y та радіуса.
  •  структура з ім'ям Color може складатися з полів для задання червоної, зеленої та синьої компонент.

Більшість вбудованих типів в C#, таких як int чи bool, визначаються структурами. Ви можете використовувати структури, щоб створювати свої власні типи, які ведуть себе як вбудовані типи.

 

5.1.2 Створення struct

Для оголошення структур використовується ключове слово struct так, як показано на наступному прикладі:

//Задання Struct

public struct Coffee

{

    public int Strength;

    public string Bean;

    public string CountryOfOrigin;

    // Інші методи, поля, властивості та події

}

Ключовому слову struct у наведеному вище прикладі передує модифікатор доступу public, що задає область видимості, тобто визначає, де ви можете використовувати цей тип. Ви можете використовувати наступні модифікатори доступу при оголошенні struct:

  •  public - код доступний у будь-якій збірці.
  •  internal - доступний для використання в тій же збірці, але не доступний для коду з іншої збірки. Це значення за замовчуванням, якщо ви не вказуєте модифікатор доступу.
  •  private - доступний тільки для коду всередині структури, яка містить його. Ви можете використовувати лише модифікатор доступу privite з вкладеними структурами.

Структури можуть містити безліч членів, включаючи конструктори, поля, константи, властивості, індексатори, методи, оператори, події і навіть вкладені типи. Майте на увазі, що структури призначені для того, щоб бути легкими, тому, якщо ви виявили багато методів, конструкторів і подій, ви повинні розглянути питання використання замість структури  класу.

 

5.1.3 Використання структури

Для створення структури, ви використовуєте ключове слово new, як продемонстровано в прикладі нижче:

Coffee coffee1 = new Coffee();

coffee1.Strength = 3;

coffee1.Bean = "Arabica";

coffee1.CountryOfOrigin = "Kenya";

 

5.1.4 Ініціалізація структури

Ви могли помітити, що синтаксис інстанціалізації структури, наприклад, new Coffee(); схожий на синтаксис для виклику методу. Це відбувається тому, що коли ви реалізуєте структуру, ви насправді викликаєте особливий тип методу, що називається конструктором. Конструктор являє собою метод в структурі, яка має ту ж назву, що і структура.

Коли ви реалізуєте структуру без аргументів, так як new Coffee(); ви викликаєте конструктор за замовчуванням, який створюється за допомогою компілятора. Якщо ви хочете мати можливість задати значення полів за замовчуванням, коли ви реалізуєте структуру, ви можете додати конструктор, що приймають параметри для вашої структури.

У наступному прикладі показано, як створити конструктор для структури.

Додавання конструктора

public struct Coffee

{

   // Конструктор з параметрами.

   public Coffee(int strength, string bean, string countryOfOrigin)

   {

      this.Strength = strength;

      this.Bean = bean;

      this.CountryOfOrigin = countryOfOrigin;

   }

  // Вирази визначають поля структури та задають значення за замовчуанням.

   public int Strength;

   public string Bean;

   public string CountryOfOrigin;

   // Інші методи, поля, властивості та події.

}

У наступному прикладі показано, як використовувати цей конструктор для створення екземпляра класу Coffee.

Виклик конструктора

// Виклик конструктора з параметрами.

Coffee coffee1 = new Coffee(4, "Arabica", "Colombia");

Ви можете додати кілька конструкторів до вашої структури. Кожен конструктор може приймати різні комбінації параметрів. Тим не менш, ви не можете додати конструктор за замовчуванням(без параметрів) для структури, так як він створюється компілятором.

 

5.1.5 Розширення структур

Для того, щоб вийти за рамки простої структури, ви можете розширити її, додавши властивості та індексатори (indexers). у структурах.

Створення властивостей

В C# властивість (property) – це програмна конструкція, яка дозволяє з клієнтського коду отримувати або встановлювати значення приватних полів всередині структури або класу. Для споживачів вашої структури або класу властивість задається як поле. У вашій структурі або класі властивість реалізується з використанням аксессорів (accessors), які представляють собою особливий тип методу. Властивість може включати в себе один або обидва з наступних дій:

  •  Аксессор доступу, щоб забезпечити доступ для читання поля.
  •  Аксессор запису, щоб забезпечити доступ для запису значення поля.

У наступному прикладі показано як реалізувати властивість Strength в структурі:

public struct Coffee

{

    private int strength;

    public int Strength 

   {

        get { return strength; }

        set { strength = value; }

    }

}

get аксессор використовує ключове слово return, щоб повернути значення приватного поля.

set аксессор використовує спеціальну локальну змінну value, що містить значення, що передається при "присвоєнні" цій властивості значення.

Наступний приклад показує, як використовувати властивість структури:

//Використання властивості

Coffee coffee1 = new Coffee();

coffee1.Strength = 3;

int coffeeStrength = coffee1.Strength;

Код, що використовує властивість структури, виглядає як ніби робота відбувається з відкритим полем. Проте використання властивостей має декілька переваг над використанням просто відкритий полів структури(класу):

· Ви можете використовувати властивості, щоб контролювати доступ до полів. Якщо зазначити лише аксессор get, можливості запису не буде(лише для зчитування). І навпаки, якщо зазначити лишеаксессор set, можливості зчитування не буде(лише можливість запису)

// Цю властивіть можна буде тільки зчитати

// код вигдяу coffee1.Strength = 3; призведе до

// помилки

public int Strength

{

    get { return strength; }

}

// в цю властивість можна лише записати значення

public string Bean

{

    set { bean = value; }

}

· Ви можете змінити реалізацію властивостей, не зачіпаючи код клієнта.

Наприклад, ви можете додати логіку перевірки, або викликати метод замість читання значення поля.

public int Strength

{

    get { return strength; }

    set

    {

        if(value < 1)

        { strength = 1; }

        else if(value > 5)

        { strength = 5; }

        else { strength = value; }

      }

}

Якщо ви хочете створити властивість, яка просто отримує і встановлює значення приватного поля без будь-якої додаткової логіки, ви можете використовувати скорочений синтаксис.

Щоб створити властивість, яка зчитує і записує в приватне поле, ви можете використовувати наступний запис:

public int Strength { get; set; }

Щоб створити властивість, яка зчитує з приватної поля, ви можете використовувати наступний запис:

public int Strength { get; }

Щоб створити властивість, яке записує в приватне поле, ви можете використовувати наступний запис:

public int Strength { set; }

Для кожного скороченого випадку компілятор неявно створить приватне поле для властивості.

Створення індексаторів

У деяких сценаріях Ви могли б хотіти використовувати структуру або клас як контейнер для масиву значень. Наприклад, Ви могли б створити структуру, щоб представляти напої, що доступні в кафе. Структура могла б використовувати масив рядків, щоб зберегти список напоїв.

Наступний приклад показує структуру, яка включає в собі масив:

public struct Menu

{

    public string[] beverages;

    public Menu(string bev1, string bev2)

    {

       beverages = new string[] { "Americano", "Café au Lait", "Café Macchiato", "Cappuccino", "Espresso", bev1, bev2 };

    }

}

У цьому випадку, щоб отримати, наприклад, перший напій зі списку потрібно було б написати так:

Menu myMenu = new Menu(/*параметри*/);

string firstDrink = myMenu.beverages[0];

Було б зручніше, якби можна було б записати так: string firstDrink = myMenu.beverages[0]. Ви можете зробити це, якщо написати індексатор. Щоб оголосити індексатор, Ви використовуєте ключове словоthis.

Наступний приклад показує, як визначити індексатор для структури:

public struct Menu

{

    private string[] beverages;

    // індексатор    public string this[int index]

    {

        get { return this.beverages[index]; }

        set { this.beverages[index] = value; }

    }

    // Дозволяє зрозуміти кількість елементів

    public int Length

    {

        get { return beverages.Length; }

    }

}

Ви використовуєте наступний синтаксис, щоб отримати напої зі списку:

Menu myMenu = new Menu();

string firstDrink = myMenu[0];

int numberOfChoices = myMenu.Length;

Ви можете створити індексатор тільки для зчитування або тільки для запису (так само як і для властивості)

 

5.2 Завдання до лабораторної роботи (Додаток Д)

 

5.3 Контрольні запитання:

 

  1. С # структури. Приклади.
  2. С # масив структур.
  3. Конструктор структури С #.
  4. С # структури даних.
  5. Відмінність структури від класу С #.