Instrução Structure

Declara o nome de uma estrutura e apresenta a definição das variáveis, propriedades, eventos e procedimentos que a estrutura abrange.

Sintaxe

[ <attributelist> ] [ accessmodifier ] [ Shadows ] [ Partial ] _
Structure name [ ( Of typelist ) ]
    [ Implements interfacenames ]
    [ datamemberdeclarations ]
    [ methodmemberdeclarations ]
End Structure

Partes

Termo Definição
attributelist Opcional. Veja Lista de atributo.
accessmodifier Opcional. Um dos seguintes pode ser feito:

- Público
- Protegido
- Friend
- Privado
- Amigo Protegido
- Particular Protegido

Consulte Níveis de acesso no Visual Basic.
Shadows Opcional. Confira Sombras.
Partial Opcional. Indica uma definição parcial da estrutura. Confira Parcial.
name Obrigatórios. Nome desta estrutura. Confira Nomes de elementos declarados.
Of Opcional. Especifica que essa é uma estrutura genérica.
typelist Obrigatório se você usar a palavra-chave Of. Lista de parâmetros de tipo para essa estrutura. Confira Lista de tipos.
Implements Opcional. Indica que essa estrutura implementa os membros de uma ou mais interfaces. Confira Instrução Implements.
interfacenames Obrigatório se você usar a instrução Implements. Os nomes das interfaces que essa estrutura implementa.
datamemberdeclarations Obrigatórios. Zero ou mais instruções Const, Dim, Enum ou Event declarando membros de dados da estrutura.
methodmemberdeclarations Opcional. Zero ou mais declarações de procedimentos Function, Operator, Property ou Sub, que servem como membros do método da estrutura.
End Structure Obrigatórios. Termina a definição Structure.

Comentários

A instrução Structure define um tipo de valor composto que você pode personalizar. Uma estrutura é uma generalização do UDT (tipo definido pelo usuário) de versões anteriores do Visual Basic. Para obter mais informações, confira Estruturas.

As estruturas dão suporte a muitos dos mesmos recursos que as classes. Por exemplo, as estruturas podem ter propriedades e procedimentos, podem implementar interfaces e ter construtores parametrizados. No entanto, há diferenças significativas entre estruturas e classes em áreas como herança, declarações e uso. Além disso, as classes são tipos de referência e as estruturas são tipos de valor. Para obter mais informações, confira Estruturas e classes.

Você só pode usar Structure no namespace ou no nível do módulo. Isso significa que o contexto de declaração de uma interface precisa ser um arquivo de origem, namespace, classe, estrutura, módulo ou interface, e não pode ser um procedimento ou bloco. Para obter mais informações, consulte Contextos de declaração e níveis de acesso padrão.

As estruturas assumem o padrão de acesso Amigo. Você pode ajustar os níveis de acesso com os modificadores de acesso. Para obter mais informações, consulte Níveis de acesso no Visual Basic.

Regras

  • Aninhamento. Você pode definir uma estrutura dentro de outra. A estrutura externa é chamada de estrutura recipiente e a estrutura interna é chamada de estrutura aninhada. No entanto, você não pode acessar os membros de uma estrutura aninhada por meio da estrutura recipiente. Em vez disso, você precisa declarar uma variável do tipo de dados da estrutura aninhada.

  • Declaração de membro. Você precisa declarar cada membro de uma estrutura. Um membro da estrutura não pode ser Protegido ou Protected Friend porque nada pode herdar de uma estrutura. No entanto, a estrutura em si pode ser Protected ou Protected Friend.

    Você pode declarar zero ou mais variáveis não compartilhadas ou eventos não compartilhados e não personalizados em uma estrutura. Você não pode ter apenas constantes, propriedades e procedimentos, mesmo que alguns deles não sejam compartilhados.

  • Inicialização. Não é possível inicializar o valor de qualquer membro de dados não compartilhados de uma estrutura como parte da declaração. É necessário inicializar esse membro de dados por meio de um construtor parametrizado na estrutura ou atribuir um valor ao membro depois de criar uma instância da estrutura.

  • Herança. Uma estrutura não pode herdar de nenhum tipo diferente de ValueType, do qual todas as estruturas herdam. Em particular, uma estrutura não pode herdar de outra.

    Você não pode usar a Instrução Inherits em uma definição de estrutura, mesmo para especificar ValueType.

  • Implementação. Se a estrutura usar a Instrução Implements, você deverá implementar todos os membros definidos por cada interface especificada em interfacenames.

  • Propriedade padrão. Uma estrutura pode especificar no máximo uma propriedade como a propriedade padrão, usando o modificador Padrão. Para obter mais informações, confira Padrão.

Comportamento

  • Nível de acesso. Em uma estrutura, você pode declarar cada membro com o próprio nível de acesso. Todos os membros da estrutura assumem o padrão de acesso Público. Observe que, se a estrutura em si tiver um nível de acesso mais restrito, isso restringirá automaticamente o acesso aos membros dela, mesmo que você ajuste os níveis de acesso com os modificadores de acesso.

  • Escopo. Uma estrutura está no escopo em todo o namespace, classe, estrutura ou módulo que a contém.

    O escopo de cada membro da estrutura é toda a estrutura.

  • Tempo de vida. Uma estrutura em si não tem tempo de vida. Em vez disso, cada instância dessa estrutura tem um tempo de vida independente de todas as outras instâncias.

    O tempo de vida de uma instância começa quando é criado por uma cláusula New Operator. Ele termina quando o tempo de vida da variável que a mantém termina.

    Não é possível estender o tempo de vida de uma instância de estrutura. Uma aproximação à funcionalidade de estrutura estática é fornecida por um módulo. Para obter mais informações, confira Instrução Module.

    Os membros da estrutura têm tempo de vida dependendo de como e onde são declarados. Para obter mais informações, confira "Tempo de vida" na Instrução Class.

  • Qualificação. O código fora de uma estrutura deve qualificar o nome de um membro com o nome dessa estrutura.

    Se o código dentro de uma estrutura aninhada fizer uma referência não qualificada a um elemento de programação, o Visual Basic procurará o elemento primeiro na estrutura aninhada e, em seguida, na estrutura recipiente e assim por diante até o elemento recipiente mais externo. Para obter mais informações, confira Referências a elementos declarados.

  • Consumo de memória. Assim como acontece com todos os tipos de dados compostos, você não pode calcular com segurança o consumo total de memória de uma estrutura adicionando as alocações de armazenamento nominais de seus membros. Além disso, você não pode supor com segurança que a ordem de armazenamento na memória seja a mesma que sua ordem de declaração. Se você precisar controlar o layout de armazenamento de uma estrutura, poderá aplicar o atributo StructLayoutAttribute à instrução Structure.

Exemplo

O exemplo a seguir usa a instrução Structure para definir um conjunto de dados relacionados para um funcionário. Ele mostra o uso de membros Public, Friend e Private para refletir a confidencialidade dos itens de dados. Ele também mostra os membros do procedimento, da propriedade e do evento.

Public Structure employee
    ' Public members, accessible from throughout declaration region.
    Public firstName As String
    Public middleName As String
    Public lastName As String
    ' Friend members, accessible from anywhere within the same assembly.
    Friend employeeNumber As Integer
    Friend workPhone As Long
    ' Private members, accessible only from within the structure itself.
    Private homePhone As Long
    Private level As Integer
    Private salary As Double
    Private bonus As Double
    ' Procedure member, which can access structure's private members.
    Friend Sub CalculateBonus(ByVal rate As Single)
        bonus = salary * CDbl(rate)
    End Sub
    ' Property member to return employee's eligibility.
    Friend ReadOnly Property Eligible() As Boolean
        Get
            Return level >= 25
        End Get
    End Property
    ' Event member, raised when business phone number has changed.
    Public Event ChangedWorkPhone(ByVal newPhone As Long)
End Structure

Para obter mais informações sobre como usar Structures, confira Variável de estrutura.

Confira também