Структуры (F#)
Структура — это компактный тип объекта, который может быть более эффективными, чем класс, для типов, имеющих небольшое количество данных и простое поведение.
[ attributes ]
type [accessibility-modifier] type-name =
struct
type-definition-elements
end
// or
[ attributes ]
[<StructAttribute>]
type [accessibility-modifier] type-name =
type-definition-elements
Заметки
Структуры относятся к типам значения — это означает, что они хранятся напрямую в стеке или, если они используются как поля или элементы массива, внутри родительского типа.В отличие от классов и записей, структуры имеют семантику передачи по значению.Это значит, что они в первую очередь полезны для небольших объемов данных, которые часто используются и копируются.
Предыдущий синтаксис содержит две формы.В первой синтаксис не облегчен, тем не менее такая форма часто используется, так как при использовании ключевых слов struct и end можно пропустить атрибут StructAttribute, который есть во второй форме.Можно сократить StructAttribute до Struct.
type-definition-elements в приведенном синтаксисе представляет объявления и определения членов.Структуры могут иметь конструкторы, изменяемые и неизменяемые поля, для них могут объявляться члены и реализации интерфейсов.Дополнительные сведения см. в разделе Члены (F#).
Структуры не могут состоять в отношениях наследования, не могут содержать привязки let или do и не могут рекурсивно содержать поля собственного типа, но могут содержать ссылочные ячейки, которые ссылаются на их собственный тип.
Так как структуры не позволяют использование привязок let, необходимо объявлять поля в структурах с помощью ключевого слова val.Ключевое слово val определяет поле и его тип, не позволяя инициализацию.Вместо этого объявления val инициализируются нулем или значением NULL.Поэтому структуры с неявным конструктором (то есть с параметрами, указанными непосредственно после имени структуры в объявлении) требуют, чтобы объявления val имели атрибут DefaultValue.Структуры с определенным конструктором также поддерживают инициализацию нулем.Поэтому атрибут DefaultValue является объявлением того, что нулевое значение для поля допустимо.Неявные конструкторы для структур не выполняют никаких действий, потому что привязки let и do разрешены для типа, но переданные значения параметров неявного конструктора доступны как закрытые поля.
Явные конструкторы могут привести к инициализации значений полей.Структуры с явными конструкторами также поддерживают инициализацию нулем; однако атрибут DefaultValue в объявлениях val не используется, так как он вступает в конфликт с явным конструктором.Дополнительные сведения об объявлениях val см. в разделе Явные поля. Ключевое слово val (F#).
Атрибуты и модификаторы доступности разрешены для структур и подчиняются тем же правилам, что и для других типов.Дополнительные сведения см. в разделах Атрибуты (F#) и Управление доступом (F#).
Следующие примеры кода иллюстрируют определения структуры.
// In Point3D, three immutable values are defined.
// x, y, and z will be initialized to 0.0.
type Point3D =
struct
val x: float
val y: float
val z: float
end
// In Point2D, two immutable values are defined.
// Point2D has an explicit constructor.
// You can create zero-initialized instances of Point2D, or you can
// pass in arguments to initialize the values.
type Point2D =
struct
val X: float
val Y: float
new(x: float, y: float) = { X = x; Y = y }
end