Шаг 191.
Язык программирования C#. Начала.
Перечисления и структуры. Знакомство со структурами

    На этом шаге мы приведем общие сведения о структурах.

    В языке C# структуры напоминают классы. По сравнению с классами возможности структур скромнее. Зато, в отличие от объектов класса, экземпляры структуры реализуются через механизм прямого доступа, что повышает эффективность обработки данных. Но обо всем по порядку. Как и класс, структура представляет собой некоторый шаблон, на основе которого создаются объекты. В случае структуры эти объекты мы будем называть экземплярами структуры. Здесь концептуально все должно быть более-менее понятно. Описывается структура, в общем-то, так же, как и класс. Разница лишь в том, что вместо ключевого слова class используется ключевое слово struct. Общий шаблон описания структуры следующий:

struct имя{
  // Тело структуры
}

    После ключевого слова struct указывается имя структуры, а в блоке из фигурных скобок описывается тело структуры: поля, методы (в том числе и операторные), индексаторы, свойства и события.

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

    Учитывая, что ограничения существенные, возникает естественный вопрос: а зачем вообще нужны структуры? В чем их преимущество? Ответ состоит в том, что структуры - это не ссылочный тип (как классы), а тип с прямым доступом к значению. Это дает преимущество в плане повышения быстродействия программы.

    Здесь уместно напомнить, как мы реализуем объекты классов. Для этого нам нужен собственно объект и еще нам нужна объектная переменная, которая на объект ссылается. Доступ к объекту мы получаем через объектную переменную, которая играет роль "посредника". Это ссылочный тип. А вот целочисленная переменная хранит не ссылку на целое число, а само это целое число. Это тип с прямым доступом к значению. Таким же типом является структура. Если мы создаем экземпляр (объект) структуры, то этот экземпляр реализуется как значение некоторой переменной, без каких бы то ни было посредников. Преимущество данного подхода в том, что операции с экземпляром выполняются быстрее, чем в случае, если бы это был аналогичный объект класса, доступ к которому необходимо получать через объектную переменную. Плата за сэкономленное время - ограничение в функциональных возможностях экземпляров структуры по сравнению с объектами классов.


Механизм, использованный в языке C# для реализации экземпляров структуры, в языке C++ используется для реализации объектов класса. Также стоит отметить, что целочисленные значения в языке C# на самом деле реализуются как экземпляры структуры.

    Экземпляр структуры создается так же, как объявляется переменная базового типа - указывается название структуры и имя переменной:

  Структура переменная;

    При создании экземпляра в этом случае поля структуры остаются неинициализированными, и поэтому перед использованием экземпляра структуры полям придется сначала присвоить значения. Если при создании экземпляра структуры мы хотим использовать конструктор с аргументами, то синтаксис создания экземпляра структуры будет такой же, как и синтаксис команды создания объекта класса, только вместо имени класса указывается имя структуры:

  Структура переменная = new Структура(аргументы);

    Как и в случае с созданием объектов класса, используется инструкция new. В результате создается экземпляр структуры, который является значением переменной, указанной слева от оператора присваивания. Подобного типа команду (с инструкцией new) можно использовать и для создания экземпляра структуры с использованием конструктора без аргументов (конструктор по умолчанию):

  Структура переменная = new Структура();

    В этом случае аргументы конструктору не передаются. Эффект от выполнения такого рода команды практически такой же, как и при создании экземпляра структуры командой вида Структура переменная. Разница в том, что при вызове конструктора по умолчанию выполняется инициализация полей. Поля инициализируются значениями по умолчанию (для числовых полей это нулевое значение, а для ссылочных типов это пустая ссылка null).


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

    После того как экземпляр структуры создан, мы можем обращаться к открытым полям и методам этого экземпляра точно так же, как мы это делали с полями и методами объектов. Для этого достаточно указать имя экземпляра структуры и через точку имя поля или имя метода с аргументами в круглых скобках (или пустыми круглыми скобками, если методу не передаются аргументы).


Кроме полей и методов, в структуре могут быть описаны свойства, индексаторы и события. Правила их описания и использования такие же, как при работе с объектами и классами. Методы (и индексаторы) для структур могут перегружаться так же, как это делается для классов. Кроме этого, структура может содержать статические члены. Для обращения к статическим членам вместо имени объекта используют имя структуры.

    На следующем шаге мы закончим изучение этого вопроса.




Предыдущий шаг Содержание Следующий шаг