Compartilhar via


Estruturas (F#)

A estrutura é um tipo de objeto compacto que pode ser mais eficiente do que uma classe para tipos que tenham uma pequena quantidade de dados e 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 elas são armazenadas diretamente na pilha ou, quando forem usadas como campos ou elementos de matriz, são embutidas no tipo pai. Ao contrário de classes e registros, as estruturas têm semântica de passar-por-valor. Isso significa que elas são úteis principalmente para pequenos agregados de dados que são acessados e copiados com frequência.

Na sintaxe anterior, duas formas são mostradas. A primeira não é a sintaxe leve, mas ela é usada com frequência, pois quando você usa as palavras-chave struct e end, é possível omitir o atributo StructAttribute, que aparece na segunda forma. É possível abreviar StructAttribute como apenas Struct.

O type-definition-elements na sintaxe anterior representa declarações e definições de membros. As estruturas podem ter construtores e campos mutáveis e imutáveis e podem declarar membros e implementações de interface. Para obter mais informações, consulte Membros (F#).

As estruturas não podem participar da herança, não podem conter associações let ou do e não podem conter recursivamente campos de seu próprio tipo (embora possam conter células de referência que fazem referência ao seu próprio tipo).

Como as estruturas não permitem associações let, você deve declarar campos em estruturas usando a palavra-chave val. A palavra-chave val define um campo e seu tipo, mas não permite inicialização. Em vez disso, as declarações val são inicializadas como zero ou nulo. Por esse motivo, as estruturas que possuem um construtor implícito (ou seja, parâmetros que são fornecidos imediatamente após o nome da estrutura na declaração) requerem que declarações val sejam anotadas com o atributo DefaultValue. As estruturas que tenham um construtor definido ainda oferecem suporte à inicialização como zero. Portanto, o atributo DefaultValue é uma declaração de que um valor zero é válido para o campo. Construtores implícitos para estruturas não executam nenhuma ação, pois as associações let e do não são permitidas no tipo, mas os valores de parâmetro construtor implícito passados estão disponíveis como campos particulares.

Construtores explícitos podem envolver inicialização de valores do campo. Quando você tem uma estrutura que possui um construtor explícito, ela ainda suporta inicialização como zero; no entanto, você não usa o atributo DefaultValue nas declarações val, pois ela entra em conflito com o construtor explícito. Para obter mais informações sobre como criar declarações val, consulte Campos explícitos: a palavra-chave val (F#).

Modificadores de atributos e de acessibilidade são permitidos em estruturas e seguem as mesmas regras dos outros tipos. Para obter mais informações, consulte Atributos (F#) e Controle de acesso (F#).

Os exemplos de código a seguir ilustram definições de estrutura.

// 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

Consulte também

Referência

Classes (F#)

Registros (F#)

Outros recursos

Referência da linguagem F#

Membros (F#)