Estruturas (F#)
A estrutura é um tipo de objeto compacto que pode ser mais eficiente do que uma classe para tipos que possuem uma pequena quantidade de dados e o comportamento simples.
[ attributes ]
type [accessibility-modifier] type-name =
struct
type-definition-elements
end
// or
[ attributes ]
[<StructAttribute>]
type [accessibility-modifier] type-name =
type-definition-elements
Comentários
Estruturas são tipos de valor, o que significa que eles são armazenados diretamente na pilha ou, quando eles são usados como campos ou digite de elementos de matriz, embutido no pai. Ao contrário de registros e classes, estruturas tem semântica de passar por valor. Isso significa que eles são úteis principalmente para a pequenas agregações de dados que são acessados e copiadas com freqüência.
A sintaxe anterior, são mostrados dois formulários. O primeiro não é a sintaxe leve, mas não obstante freqüentemente é usado porque, quando você usa o struct e end palavras-chave, você pode omitir a StructAttribute atributo, que aparece no segundo formulário. Você pode abreviar StructAttribute apenas Struct.
O type-definition-elements na sintaxe anterior representa as declarações de membro e definições. Estruturas podem ter construtores e campos mutáveis e imutáveis, e eles podem declarar membros e implementações de interface. Para obter mais informações, consulte Membros (F#).
Estruturas não podem participar de herança, não pode conter let ou do ligações, e não é possível recursivamente contêm campos de seu próprio tipo (embora eles podem conter células de referência que seu próprio tipo de referência).
Estruturas permitem let ligações, você deve declarar estruturas campos usando o val palavra-chave. O val define um campo e seu tipo de palavra-chave mas não permite a inicialização. Em vez disso, val declarações são inicializadas para zero ou nulo. Por esse motivo, estruturas que tem um construtor implícito (ou seja, parâmetros que são dadas imediatamente após o nome da estrutura na declaração) exigem que val declarações ser anotada com o DefaultValue atributo. Estruturas que tem um construtor definido ainda oferece suporte a inicialização do zero. Portanto, o DefaultValue atributo é uma declaração que tal um valor zero é válido para o campo. Construtores implícitas para estruturas não executar quaisquer ações porque let e do as ligações são permitidas em tipo, mas os valores de parâmetro de construtor implícito passados estão disponíveis como campos particulares.
Construtores explícitos podem envolver a inicialização dos valores de campo. Quando você tem uma estrutura de um construtor explícito, ele ainda suporta a inicialização do zero; No entanto, você não usar o DefaultValue de atributo na val declarações porque está em conflito com o construtor explícito. Para obter mais informações sobre val declarações, consulte Campos explícitos: O val palavra-chave (F#).
Atributos e modificadores de acessibilidade são permitidos em estruturas e siga as mesmas regras que as de outros tipos. Para obter mais informações, consulte Atributos (F#) e Controle de acesso (F#).
Os exemplos de código a seguir ilustram as definições de estruturas.
// 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