Всі написані раніше програми використовували вже існуючі класи і їхні методи.
Розробка ж реального додатки полягає не тільки у використанні стандартних класів, а й у створенні нових класів, створенні об'єктів цих класів і у визначенні їх взаємодії.
Настав час докладніше вивчити структуру, правила створення і використання класів.
В попередніх темах ми користувалися класами з стандартної бібліотеки класів Framework Class Library. Фізично бібліотека FCL являє собою набір DLL файлів.
Вбудовані типи даних, такі як цілі, речові, логічні, реалізовані в модулі Mscorlib.dll, інші типи рознесені по різних DLL файлів бібліотеки FCL.
Для полегшення використання FCL, все її зміст добре структуроване у вигляді ієрархічно організованих груп типів.
Кожна група типів називається простором імен.
Всього в FCL близько 100 таких просторів.
В кожному з них містяться класи та інші типи, що мають деяке загальне призначення.
Наприклад, велика частина класів для управління об'єктами графічного інтерфейсу додатків Windows входить до складу просторі імен System.Windows.Forms (класи, що представляють вікна, діалоги, меню та інші елементи).
З теоретичної точки зору:
Клас - це тип, що описує пристрій об'єктів.
Поля - це змінні, що належать класу.
Методи - це функції (процедури), що належать класу.
Об'єкт - це екземпляр класу.
Можна сказати, що клас є шаблоном для об'єкта, що описує його структуру і поведінку. Поля класу визначають структуру об'єкта, методи класу - поведінка об'єкта.
З точки зору практичної реалізації (в самому тексті програми) клас є типом даних, а об'єкт - змінної цього типу.
Отже, класи відносяться до посилальним типам даних. Це означає, що об'єкти конкретного класу доступні за посиланням, на відміну від значень простих типів, доступних безпосередньо. Але іноді прямий доступ до об'єктів як до значень простих типів виявляється корисно мати, наприклад, заради підвищення ефективності програми. Адже кожен доступ до об'єктів (навіть найдрібнішим) за посиланням пов'язаний з додатковими витратами на витрату обчислювальних ресурсів і оперативної пам'яті.
Для вирішення подібних труднощів в C # передбачена структура, яка подібна до класу, але відноситься до типу значення, а не до посилального типу даних. Тобто структури відрізняються від класів тим, як вони зберігаються в пам'яті і як до них здійснюється доступ (класи - це посилальні типи, що розміщуються в купі, структури - типи значень, що розміщуються в стек), а також деякими властивостями (наприклад, структури не підтримують успадкування) . З міркувань продуктивності ви будете використовувати структури для невеликих типів даних. Однак щодо синтаксису структури дуже схожі на класи.
Головна відмінність полягає в тому, що при їх оголошенні використовується ключове слово struct замість class.
У кожної структури є свої члени: методи, поля, індексатори, властивості, операторні методи і події. У структурах допускається також визначати конструктори. У той же час для структури не можна визначити конструктор, який використовується за умовчанням (тобто конструктор без параметрів). Справа в тому, що конструктор, що викликається за замовчуванням, визначається для всіх структур автоматично і не підлягає зміні. Такий конструктор ініціалізує поля структури значеннями, що задаються за умовчанням. А оскільки структури не підтримують успадкування, то їх члени не можна вказувати як abstract, virtual або protected.
Об'єкт структури може бути створений за допомогою оператора new таким же чином, як і об'єкт класу, але в цьому немає особливої ??необхідності. Адже коли використовується оператор new, то викликається конструктор, який використовується за умовчанням. А коли цей оператор не використовується, об'єкт і раніше створюється, хоча і не ініціалізується. В цьому випадку ініціалізацію будь-яких членів структури доведеться виконати вручну.
Структура
Тестування:
Результат:
Зверніть увагу, коли одна структура присвоюється інший, створюється копія її об'єкта. У цьому полягає одна з головних відмінностей структури від класу. Коли посилання на один клас присвоюється посиланням на інший клас, в результаті посилання в лівій частині оператора присвоювання вказує на той же самий об'єкт, що і посилання в правій його частині. А коли змінна однієї структури присвоюється змінної іншої структури, створюється копія об'єкта структури з правої частини оператора присвоювання.
Тому, якби в попередньому прикладі використовувався клас UserInfo замість структури, вийшов би наступний результат: