Поделиться через


Структуры (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

См. также

Ссылки

Классы (F#)

Записи (F#)

Другие ресурсы

Справочник по языку F#

Члены (F#)