Estructuras (F#)
Una estructura es un tipo de objeto compacto que puede ser más eficaz que una clase para los tipos que tienen una pequeña cantidad de datos y un comportamiento simple.
[ attributes ]
type [accessibility-modifier] type-name =
struct
type-definition-elements
end
// or
[ attributes ]
[<StructAttribute>]
type [accessibility-modifier] type-name =
type-definition-elements
Comentarios
Las estructuras son tipos de valor, lo que significa que se almacenan directamente en la pila o, cuando se utilizan como campos o elementos de matriz, se insertan en el tipo primario. A diferencia de las clases y los registros, las estructuras tienen una semántica de paso por valor. Esto significa que son sobre todo útiles para pequeños agregados de datos que se copian y a los que se obtiene acceso con frecuencia.
En la sintaxis anterior se muestran dos formatos. En el primero no se usa la sintaxis simplificada; no obstante, se usa con frecuencia ya que, cuando se utilizan las palabras clave end y struct, se puede omitir el atributo StructAttribute que aparece en el segundo formato. Se puede abreviar StructAttribute y usar simplemente Struct.
En la sintaxis anterior, type-definition-elements representa definiciones y declaraciones de miembros. Las estructuras pueden tener constructores así como campos mutables e inmutables; además, pueden declarar miembros e implementaciones de interfaces. Para obtener más información, vea Miembros (F#).
Las estructuras no pueden participar en la herencia, no pueden contener enlaces let ni do, y no pueden contener de forma recursiva campos de su propio tipo (aunque pueden contener celdas de referencia que hacen referencia a su propio tipo).
Dado que las estructuras no permiten enlaces let, sus campos deben declararse mediante la palabra clave val. La palabra clave val define un campo y su tipo, pero no permite la inicialización. En su lugar, las declaraciones de val se inicializan en cero o null. Por esta razón, las estructuras que tienen un constructor implícito (es decir, parámetros que se proporcionan inmediatamente después del nombre de la estructura en la declaración) requieren que las declaraciones de val se anoten con el atributo DefaultValue. Las estructuras que tienen un constructor definido admiten la inicialización en cero. Por consiguiente, el atributo DefaultValue es una declaración de que ese valor cero es válido para el campo. Los constructores implícitos de las estructuras no realizan ninguna acción porque los enlaces let y do están permitidos en el tipo, pero los valores de parámetro de los constructores implícitos que se han pasado están disponibles como campos privados.
Los constructores explícitos podrían implicar la inicialización de los valores de campo. En el caso de una estructura que tiene un constructor explícito, se admite la inicialización en cero pero no se usa el atributo DefaultValue en las declaraciones de val porque está en conflicto con el constructor explícito. Para obtener más información sobre las declaraciones de val, vea Campos explícitos: palabra clave val (F#).
Los atributos y modificadores de accesibilidad están permitidos en las estructuras y siguen las mismas reglas que las que se aplican para otros tipos. Para obtener más información, vea Atributos (F#) y Control de acceso (F#).
En los ejemplos de código siguientes se muestran definiciones de estructuras.
// 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