Керівництво c #, структури
Як вам повинно бути вже відомо, класи відносяться до посилальним типам даних. Це означає, що об'єкти конкретного класу доступні за посиланням, на відміну від значень простих типів, доступних безпосередньо. Але іноді прямий доступ до об'єктів як до значень простих типів виявляється корисно мати, наприклад, заради підвищення ефективності програми. Адже кожен доступ до об'єктів (навіть найдрібнішим) за посиланням пов'язаний з додатковими витратами на витрату обчислювальних ресурсів і оперативної пам'яті.
Для вирішення подібних труднощів в C # передбачена структура. яка подібна класу, але відноситься до типу значення, а не до посилального типу даних. Тобто структури відрізняються від класів тим, як вони зберігаються в пам'яті і як до них здійснюється доступ (класи - це посилальні типи, що розміщуються в купі, структури - типи значень, що розміщуються в стек), а також деякими властивостями (наприклад, структури не підтримують успадкування) . З міркувань продуктивності ви будете використовувати структури для невеликих типів даних. Однак щодо синтаксису структури дуже схожі на класи.
де ім'я позначає конкретне ім'я структури.
Як і у класів, у кожної структури є свої члени: методи, поля, індексатори, властивості, операторні методи і події. У структурах допускається також визначати конструктори, але не деструктори. У той же час для структури не можна визначити конструктор, який використовується за умовчанням (тобто конструктор без параметрів). Справа в тому, що конструктор, що викликається за замовчуванням, визначається для всіх структур автоматично і не підлягає зміні. Такий конструктор ініціалізує поля структури значеннями, що задаються за умовчанням. А оскільки структури не підтримують успадкування, то їх члени не можна вказувати як abstract, virtual або protected.
Об'єкт структури може бути створений за допомогою оператора new таким же чином, як і об'єкт класу, але в цьому немає особливої необхідності. Адже коли використовується оператор new, то викликається конструктор, який використовується за умовчанням. А коли цей оператор не використовується, об'єкт і раніше створюється, хоча і не ініціалізується. В цьому випадку ініціалізацію будь-яких членів структури доведеться виконати вручну.
Давайте розглянемо приклад використання структур:
Тому, якби в попередньому прикладі використовувався клас UserInfo замість структури, вийшов би наступний результат:
призначення структур
У зв'язку з викладеним вище виникає резонне питання: навіщо в C # включена структура, якщо вона володіє більш скромними можливостями, ніж клас? Відповідь на це питання полягає в підвищенні ефективності та продуктивності програм. Структури відносяться до типів значень, і тому ними можна оперувати безпосередньо, а не за посиланням. Отже, для роботи зі структурою взагалі не потрібно змінна посилального типу, а це означає в ряді випадків істотну економію оперативної пам'яті.
Більш того, робота із структурою не призводить до погіршення продуктивності, настільки характерному для звернення до об'єкту класу. Адже доступ до структури здійснюється безпосередньо, а до об'єктів - за посиланням, оскільки класи відносяться до даних довідкового типу. Непрямий характер доступу до об'єктів має на увазі додаткові витрати обчислювальних ресурсів на кожен такий доступ, тоді як звернення до структур не тягне за собою подібні витрати. І взагалі, якщо потрібно просто зберегти групу пов'язаних разом даних, які не потребують успадкування та звернення за посиланням, то з точки зору продуктивності для них краще вибрати структуру.
Цікаво, що в С ++ також є структури і використовується ключове слово struct. Але ці структури відрізняються від тих, що є в C #. Так, в С ++ структура відноситься до типу класу, а значить, структура і клас в цій мові практично рівноцінні і відрізняються один від одного лише доступом за замовчуванням до їх членам, які виявляються закритими для класу і відкритими для структури. А в C # структура відноситься до типу значення, тоді як клас - до посилального типу.