Estructuras (F#)
Una estructura es un tipo de objeto compacto que puede ser más eficaz que una clase en 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 tipo de elementos de la matriz, alineados en el tipo primario. A diferencia de los registros y las clases, las estructuras tienen semántica de paso por valor. Esto significa que son útiles principalmente para pequeños agregados de datos a los que accede y que se copian con frecuencia.
En la sintaxis anterior, se muestran dos formularios. La primera no es la sintaxis ligera; sin embargo, se utiliza frecuentemente porque, cuando se usan las palabras clave struct y end, se puede omitir el atributo StructAttribute, que aparece en el segundo formulario. StructAttribute se puede abreviar como Struct.
En la sintaxis anterior, type-definition-elements representa definiciones y declaraciones de miembros. Las estructuras pueden tener constructores y campos mutables e inmutables, y pueden declarar implementaciones de interfaces y miembros. 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 puede contener de forma recursiva campos de su propio tipo (aunque pueden contener celdas de referencia que hagan referencia a su propio tipo).
Dado que las estructuras no permiten enlaces let, debe declarar campos en estructuras mediante el uso de 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 val se inicializan en cero o null. Por este motivo, las estructuras que tienen un constructor implícito (es decir, los parámetros que se proporcionan inmediatamente después del nombre de la estructura en la declaración) requieren que las declaraciones val se anoten con el atributo DefaultValue. Las estructuras que tienen un constructor definido todavía admiten la inicialización en cero. Por lo tanto, 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 no están permitidos en el tipo, pero los valores de parámetro de constructor implícito pasados están disponibles como campos privados.
Los constructores explícitos podrían implicar la inicialización de los valores de campo. Cuando se tiene una estructura con un constructor explícito, se admite la inicialización en cero; sin embargo, no se utiliza el atributo DefaultValue en las declaraciones val porque entra en conflicto con el constructor explícito. Para obtener más información sobre las declaraciones 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 de otros tipos. Para obtener más información, vea Atributos (F#) y Control de acceso (F#).
Los siguientes ejemplos de código ilustran las definiciones de la estructura.
// 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