На этом шаге мы приведем общие сведения о структурах.
В языке C# структуры напоминают классы. По сравнению с классами возможности структур скромнее. Зато, в отличие от объектов класса, экземпляры структуры реализуются через механизм прямого доступа, что повышает эффективность обработки данных. Но обо всем по порядку. Как и класс, структура представляет собой некоторый шаблон, на основе которого создаются объекты. В случае структуры эти объекты мы будем называть экземплярами структуры. Здесь концептуально все должно быть более-менее понятно. Описывается структура, в общем-то, так же, как и класс. Разница лишь в том, что вместо ключевого слова class используется ключевое слово struct. Общий шаблон описания структуры следующий:
struct имя{ // Тело структуры }
После ключевого слова struct указывается имя структуры, а в блоке из фигурных скобок описывается тело структуры: поля, методы (в том числе и операторные), индексаторы, свойства и события.
Вместе с тем, если сравнивать с классами, на структуры накладываются существенные ограничения. Ниже перечислены наиболее важные особенности структур.
Учитывая, что ограничения существенные, возникает естественный вопрос: а зачем вообще нужны структуры? В чем их преимущество? Ответ состоит в том, что структуры - это не ссылочный тип (как классы), а тип с прямым доступом к значению. Это дает преимущество в плане повышения быстродействия программы.
Здесь уместно напомнить, как мы реализуем объекты классов. Для этого нам нужен собственно объект и еще нам нужна объектная переменная, которая на объект ссылается. Доступ к объекту мы получаем через объектную переменную, которая играет роль "посредника". Это ссылочный тип. А вот целочисленная переменная хранит не ссылку на целое число, а само это целое число. Это тип с прямым доступом к значению. Таким же типом является структура. Если мы создаем экземпляр (объект) структуры, то этот экземпляр реализуется как значение некоторой переменной, без каких бы то ни было посредников. Преимущество данного подхода в том, что операции с экземпляром выполняются быстрее, чем в случае, если бы это был аналогичный объект класса, доступ к которому необходимо получать через объектную переменную. Плата за сэкономленное время - ограничение в функциональных возможностях экземпляров структуры по сравнению с объектами классов.
Экземпляр структуры создается так же, как объявляется переменная базового типа - указывается название структуры и имя переменной:
Структура переменная;
При создании экземпляра в этом случае поля структуры остаются неинициализированными, и поэтому перед использованием экземпляра структуры полям придется сначала присвоить значения. Если при создании экземпляра структуры мы хотим использовать конструктор с аргументами, то синтаксис создания экземпляра структуры будет такой же, как и синтаксис команды создания объекта класса, только вместо имени класса указывается имя структуры:
Структура переменная = new Структура(аргументы);
Как и в случае с созданием объектов класса, используется инструкция new. В результате создается экземпляр структуры, который является значением переменной, указанной слева от оператора присваивания. Подобного типа команду (с инструкцией new) можно использовать и для создания экземпляра структуры с использованием конструктора без аргументов (конструктор по умолчанию):
Структура переменная = new Структура();
В этом случае аргументы конструктору не передаются. Эффект от выполнения такого рода команды практически такой же, как и при создании экземпляра структуры командой вида Структура переменная. Разница в том, что при вызове конструктора по умолчанию выполняется инициализация полей. Поля инициализируются значениями по умолчанию (для числовых полей это нулевое значение, а для ссылочных типов это пустая ссылка null).
После того как экземпляр структуры создан, мы можем обращаться к открытым полям и методам этого экземпляра точно так же, как мы это делали с полями и методами объектов. Для этого достаточно указать имя экземпляра структуры и через точку имя поля или имя метода с аргументами в круглых скобках (или пустыми круглыми скобками, если методу не передаются аргументы).
На следующем шаге мы закончим изучение этого вопроса.