Общее описание
Структура представляет собой тип, имеющий фиксированный набор полей и методов, а также конструктор. Каждое поле имеет тип, указанный при разработке структуры. Структура может содержать данные, а также описания методов. После описания структуры ее можно использовать в программах наряду с другими типами данных.
Синтаксис
Синтаксис объявления структуры:
структура имя-структуры
[модификатор-обязательности модификатор имя-поля: тип-поля[ = значение-инициализации]]
[модификатор-обязательности модификатор имя-поля: тип-поля[ = значение-инициализации]]
[модификатор-обязательности модификатор имя-поля: тип-поля[ = значение-инициализации]]
...
[конструктор]
...
[метод]
[метод]
;
-
структура
Ключевое слово, с помощью которого объявляется структура.
-
имя-структуры
имя-структуры указывает имя описываемой структуры (имя типа). С помощью этого имени в дальнейшем будет происходить использование создаваемой структуры, например, создание переменной с типом структуры. Имя структуры должно соответствовать общим требованиям к именам языка.
-
модификатор-обязательности
Ключевое слово обз
, которым обозначаются обязательные поля конструктора. Обязательные поля должны быть проинициал изированы при создании экземпляра структуры. Поля, не отмеченные данным модификатором, являются необязательными.
-
модификатор
Каждое поле структуры объявляется аналогично обычной переменной в модуле (подробнее). Оно начинается с ключевого слова пер
или знч
, затем следует имя поля, его тип и необязательное значение инициализации. Имена полей должны соответствовать общим требованиям к именам языка.
Поле структуры не может быть описано таким образом, чтобы у него был тип самой определяемой структуры. Другими словами, не допускается рекурсивное объявление типа поля.
Имена полей должны быть уникальны в рамках одной структуры.
Если описание поля структуры начинается с модификатора пер
, то значение такого поля может быть изменено путем присваивани я значения. Если описание поля структуры начинается с модификатора знч
, то для такого поля значение может быть установлено только во время создания экземпляра структуры с помощью конструктора.
-
значение-инициализации
Описывает, какое значение будет принимать поле при создании экземпляра по умолчанию. В качестве значения инициализации может выступать любое выражение, которое вычислимо во время компиляции. Если для поля не задано явное значение инициализации по умолчанию, то используется значение по умолчанию типа или конструктор типа без параметров (если тип не составной). Если у типа отсутствует значение по умолчанию, разработчиком явно не задано значение по умолчанию для поля и указан модификатор обз
, будет ошибка.
-
конструктор
По умолчанию для структуры создается автоматический конструктор, который включает в себя все поля структуры в том порядке, в котором они описаны в самой структуре. Для настройки конструктора используется ключевое слово конструктор
, которое в структуре может указываться только один раз. Перед этим ключе вым словом могут быть размещены аннотации, которые будут использоваться для настройки конструктора (например, @ИменованныеПараметры
). Область видимости конструктора соответствует видимости структуры и не может быть изменена.
Пример:
структура МояСтруктура
пер СтроковоеПоле: Строка
пер ЧисловоеПоле: Число
@ИменованныеПараметры
конструктор
;
-
метод
Метод структуры — это метод, который принадлежит структуре и позволяет выполнять различные действия над ее экземплярами или над ней самой. Методы могут быть:
- Простыми — для работы с экземплярами структуры. Имеют доступ к полям структуры.
- Статическими — для работы со структурой в целом. Не требуют создания экземпляра структуры. Для объявления используется ключевое слово
статический
.
Примеры объявления и вызова методов:
структура Продажа
обз пер Товар: Строка
обз пер Дата: Дата
метод СтруктураВСтроку(): Строка
возврат Товар + " " + Дата
;
статический метод ИзСтроки(СтрокаПродажи: Строка): Продажа
знч Части = СтрокаПродажи.Разделить(" ")
возврат новый Продажа(Части[0], новый Дата(Части[1]))
;
;
метод ОбработатьПродажи(): Массив<Строка>
пер ПродажаИзСтроки = Продажа.ИзСтроки("Кружка 07.07.2025")
пер НоваяПродажа = новый Продажа("Тарелка", Дата.Сейчас())
знч МассивПродаж = [ПродажаИзСтроки.СтруктураВСтроку(), НоваяПродажа.СтруктураВСтроку()]
возврат МассивПродаж
;
Работа со структурой
Первым шагом к использованию собственного типа данных является описание этого типа. Рассмотрим простой пример данных: сохраним информацию о каком-либо файле. Допустим, нам необходимо хранить о файле следующие сведения:
- имя файла;
- тип файла — исполняемый или неисполняемый;
- полный путь к файлу;
- размер файла;
- дата и время создания файла (необязательный параметр).
Для этого создадим следующую структуру:
структура ОписаниеФайла
обз пер ИмяФайла: Строка
обз знч Исполняемый: Булево
обз пер ПолныйПуть: Строка
обз пер РазмерФайла: Число
пер Создан: ДатаВремя
;
Если потребуется объявить переменную с типом ОписаниеФайла
, то сделать это можно обычным образом: пер Файл: ОписаниеФайла
. Важно помнить, что при объявлении переменной с типом структуры все обязательные поля должны быть проинициализированы значением по умолчанию. Если надо сразу инициализировать переменную некоторым значением, то это можно сделать следующим образом (на примере командного процессора ОС Windows 10 версии 1903):
структура ОписаниеФайла
обз пер ИмяФайла: Строка
обз знч Исполняемый: Булево
обз пер ПолныйПуть: Строка
обз пер Ра змерФайла: Число
пер Создан: ДатаВремя
;
метод Описать()
пер КомандныйПроцессор: ОписаниеФайла = новый ОписаниеФайла("cmd.exe",
Истина,
"C:\\Windows\\System32\\cmd.exe",
280064)
;
В данном примере видно, каким образом формируются данные инициализации. Данными инициализации являются значения, указанные в конструкторе через запятую. Значения будут присваиваться полям структуры в следующем порядке: значения конструктора слева направо будут присваиваться полям структуры сверху вниз:
- полю
ИмяФайла
будет присвоена строка cmd.exe
;
- полю
Исполняемый
будет присвоено значение Ложь
;
- полю
ПолныйПуть
будет присвоена строка C:\\Windows\\System32\\cmd.exe
;
- полю
РазмерФайла
будет присвоено значение 280064,
- полю
Создан
будет присвоено значение по умолчанию типа ДатаВремя
, т.к. это необязательное поле не было проинициализировано при вызове конструктора структуры.
Стоит обратить внимание на то, что свойство Исполняемый
указано с модификатором знч
. А это означает, что написать выражение КомандныйПроцессор.Исполняемый = Ложь
уже не получится.
Очевидно, что в реальной жизни параметры файла следует заполнять, предварительно получив эти значения у файловой системы, но в примере можно пойти на некоторое упрощение и заранее получить нужные значения.
Для получения значения поля структуры используйте операцию .
: КомандныйПроцессор.ИмяФайла
вернет значение, которое находится в поле ИмяФайла
переменной КомандныйПроцессор
, описанной с типом структуры ОписаниеФайла
. Указанное выражение может использоваться как в качестве источника — для получения значения поля, так и в качестве назначения выражения — для установки значения поля.
Для безопасно го динамического обращения к полю структуры рекомендуется использовать механизм отражения с обработкой исключения:
метод ПолучитьЗначениеСвойства(Структура: ОписаниеФайла, Свойство: Строка): Объект?
пер ОписаниеСвойства: ОтражениеСвойства?
попытка
ОписаниеСвойства = Структура.ПолучитьТип().ПолучитьСвойство(Свойство)
поймать Исключение: ИсключениеОтражения
возврат Неопределено
;
возврат ОписаниеСвойства.Получить(Структура)
;
Можно также привести переменную к типу неизвестно
и вызвать оператор []
:
метод ПолучитьЗначениеСвойства(Структура: ОписаниеФайла, Свойство: Строка): Объект?
возврат (Структура как неизвестно)[Свойство]
;
Сравнение структур
Допустимо сравнение двух значений типа структура на равенство (или неравенство). Две структуры будут считаться равными, если эти структуры одного типа и значения полей попарно совпадают.
структура ОписаниеФайла
обз пер ИмяФайла: Строка
обз знч Исполняемый: Булево
;
метод Сравнить(): Булево
пер Файл1 = новый ОписаниеФайла("log.txt", Ложь)
пер Файл2 = новый ОписаниеФайла("log.txt", Ложь)
возврат Файл1 == Файл2
;
См. также