Instrução Enum (Visual Basic)

Declara uma enumeração e define os valores dos membros.

Sintaxe

[ <attributelist> ] [ accessmodifier ]  [ Shadows ]
Enum enumerationname [ As datatype ]
   memberlist
End Enum

Partes

  • attributelist

    Opcional. Lista de atributos que se aplicam a essa enumeração. Você deve colocar a lista de atributos entre colchetes angulares ("<" e ">").

    O atributo FlagsAttribute indica que o valor de uma instância da enumeração pode incluir vários membros de enumeração e que cada membro representa um campo de bits no valor de enumeração.

  • accessmodifier

    Opcional. Especifica qual código pode acessar essa enumeração. Um dos seguintes pode ser feito:

  • Shadows

    Opcional. Especifica que essa enumeração declara novamente e oculta um elemento de programação nomeado de maneira idêntica, ou conjunto de elementos sobrecarregados, em uma classe base. Você pode especificar Sombras apenas na enumeração em si, não em nenhum dos membros.

  • enumerationname

    Obrigatórios. Nome da enumeração. Para obter informações sobre nomes válidos, confira Nomes de elemento declarados.

  • datatype

    Opcional. Tipo de dados da enumeração e todos os membros.

  • memberlist

    Obrigatórios. Lista de constantes de membro que estão sendo declaradas nesta instrução. Vários membros aparecem em linhas de código-fonte individuais.

    Cada member tem a seguinte sintaxe e partes: [<attribute list>] member name [ = initializer ]

    Parte Descrição
    membername Obrigatórios. Nome desse membro.
    initializer Opcional. Expressão avaliada em tempo de compilação e atribuída a este membro.
  • End Enum

    Termina o bloco Enum.

Comentários

Se você tiver um conjunto de valores inalterados logicamente relacionados uns aos outros, poderá defini-los juntos em uma enumeração. Isso fornece nomes significativos para a enumeração e os membros, que são mais fáceis de lembrar do que os valores. Em seguida, você pode usar os membros de enumeração em muitos locais em seu código.

Os benefícios da utilização de enumerações são:

  • Reduz erros causados pela transposição ou digitação incorreta de números.

  • Torna mais fácil alterar valores no futuro.

  • Torna o código mais fácil de ler, o que significa que é menos provável que os erros sejam introduzidos.

  • Garante a compatibilidade com o futuro. Se você usa enumerações, o código será menos propenso a falhar se, posteriormente, alguém alterar os valores correspondentes aos nomes dos membros.

Uma enumeração tem um nome, um tipo de dados subjacente e um conjunto de membros. Cada membro representa uma constante.

Uma enumeração declarada no nível de classe, estrutura, módulo ou interface, fora de qualquer procedimento, é uma enumeração de membro. Ela é um membro da classe, da estrutura, do módulo ou da interface que a declara.

As enumerações de membro podem ser acessadas de qualquer lugar dentro da classe, da estrutura, do módulo ou da interface. O código fora de uma classe, estrutura ou módulo deve qualificar o nome de uma enumeração de membro com o nome dessa classe, estrutura ou módulo. Você pode evitar a necessidade de usar nomes totalmente qualificados adicionando uma instrução Imports ao arquivo de origem.

Uma enumeração declarada no nível do namespace, fora de qualquer classe, estrutura, módulo ou interface, é um membro do namespace no qual ela aparece.

O contexto de declaração para uma enumeração deve ser um arquivo de origem, namespace, classe, estrutura, módulo ou interface e não pode ser um procedimento. Para obter mais informações, consulte Contextos de declaração e níveis de acesso padrão.

Você pode aplicar atributos a uma enumeração como um todo, mas não aos membros individualmente. Um atributo contribui com informações para os metadados do assembly.

Tipo de Dados

A instrução Enum pode declarar o tipo de dados de uma enumeração. Cada membro usa o tipo de dados da enumeração. Você pode especificar Byte, Integer, Long, SByte, Short, UInteger, ULong ou UShort.

Se você não especificar datatype para a enumeração, cada membro usará o tipo de dados de initializer. Se você especificar datatype e initializer, o tipo de dados de initializer deverá ser conversível para datatype. Se nem datatype nem initializer estiver presente, o tipo de dados será padrão para Integer.

Inicialização de membros

A instrução Enum pode inicializar o conteúdo dos membros selecionados em memberlist. Você usa initializer para fornecer uma expressão a ser atribuída ao membro.

Se você não especificar initializer para um membro, o Visual Basic o inicializará como zero (se for o primeiro member em memberlist) ou como um valor maior por um do que o member imediatamente anterior.

A expressão fornecida em cada initializer pode ser qualquer combinação de literais, outras constantes que já estão definidas e membros de enumeração que já estão definidos, incluindo um membro anterior dessa enumeração. Você pode usar operadores aritméticos e lógicos para combinar esses elementos.

Você não pode usar variáveis ou funções em initializer. No entanto, você pode usar palavras-chave de conversão, como CByte e CShort. Você também pode usar AscW se chamá-lo com uma constante String ou um argumento Char, já que isso pode ser avaliado em tempo de compilação.

As enumerações não podem ter valores de ponto flutuante. Se um membro receber um valor de ponto flutuante e Option Strict estiver definido como ativado, ocorrerá um erro do compilador. Se Option Strict estiver desativado, o valor será convertido automaticamente no tipo Enum.

Se o valor de um membro exceder o intervalo permitido para o tipo de dados subjacente ou se você inicializar qualquer membro para o valor máximo permitido pelo tipo de dados subjacente, o compilador relatará um erro.

Modificadores

As enumerações de membro de classe, estrutura, módulo e interface assumem o padrão de acesso público. Você pode ajustar os níveis de acesso com os modificadores de acesso. Enumerações de membro de namespace assumem o padrão de acesso de amigos. Você pode ajustar os níveis de acesso para público, mas não para particular nem protegido. Para obter mais informações, confira Níveis de acesso no Visual Basic.

Todos os membros de enumeração têm acesso público, e você não pode usar modificadores de acesso neles. No entanto, se a enumeração em si tiver um nível de acesso mais restrito, o nível de acesso especificado da enumeração terá precedência.

Por padrão, todas as enumerações são tipos e os campos são constantes. Portanto, as palavras-chave Shared, Static e ReadOnly não podem ser usadas ao declarar uma enumeração ou os membros.

Atribuição de vários valores

As enumerações normalmente representam valores mutuamente exclusivos. Ao incluir o atributo FlagsAttribute na declaração Enum, você pode atribuir vários valores a uma instância da enumeração. O atributo FlagsAttribute especifica que a enumeração pode ser tratada como um campo de bits; isto é, um conjunto de sinalizadores. Elas são chamadas de enumerações bit a bit.

Quando você declara uma enumeração usando o atributo FlagsAttribute, recomendamos que você use potências de 2, ou seja, 1, 2, 4, 8, 16 e assim por diante, para os valores. Também recomendamos que "Nenhum" seja o nome de um membro cujo valor é 0. Para obter diretrizes adicionais, confira FlagsAttribute e Enum.

Exemplo 1

O exemplo a seguir mostra como usar a instrução Enum. Observe que o membro é conhecido como EggSizeEnum.Medium, e não como Medium.

Public Class Egg
    Enum EggSizeEnum
        Jumbo
        ExtraLarge
        Large
        Medium
        Small
    End Enum

    Public Sub Poach()
        Dim size As EggSizeEnum

        size = EggSizeEnum.Medium
        ' Continue processing...
    End Sub
End Class

Exemplo 2

O método no exemplo a seguir está fora da Egg classe. Portanto, EggSizeEnum é totalmente qualificado como Egg.EggSizeEnum.

Public Sub Scramble(ByVal size As Egg.EggSizeEnum)
    ' Process for the three largest sizes.
    ' Throw an exception for any other size.
    Select Case size
        Case Egg.EggSizeEnum.Jumbo
            ' Process.
        Case Egg.EggSizeEnum.ExtraLarge
            ' Process.
        Case Egg.EggSizeEnum.Large
            ' Process.
        Case Else
            Throw New ApplicationException("size is invalid: " & size.ToString)
    End Select
End Sub

Exemplo 3

O exemplo a seguir usa a instrução Enum para definir um conjunto relacionado de valores de constante nomeados. Nesse caso, os valores são cores que você pode optar por criar formulários de entrada de dados para um banco de dados.

Public Enum InterfaceColors
    MistyRose = &HE1E4FF&
    SlateGray = &H908070&
    DodgerBlue = &HFF901E&
    DeepSkyBlue = &HFFBF00&
    SpringGreen = &H7FFF00&
    ForestGreen = &H228B22&
    Goldenrod = &H20A5DA&
    Firebrick = &H2222B2&
End Enum

Exemplo 4

O exemplo a seguir mostra valores que incluem números positivos e negativos.

Enum SecurityLevel
    IllegalEntry = -1
    MinimumSecurity = 0
    MaximumSecurity = 1
End Enum

Exemplo 5

No exemplo a seguir, uma cláusula As é usada para especificar o datatype de uma enumeração.

Public Enum MyEnum As Byte
    Zero
    One
    Two
End Enum

Exemplo 6

O exemplo a seguir mostra como usar uma enumeração bit a bit. Vários valores podem ser atribuídos a uma instância de uma enumeração bit a bit. A declaração Enum inclui o atributo FlagsAttribute, que indica que a enumeração pode ser tratada como um conjunto de sinalizadores.

' Apply the Flags attribute, which allows an instance
' of the enumeration to have multiple values.
<Flags()> Public Enum FilePermissions As Integer
    None = 0
    Create = 1
    Read = 2
    Update = 4
    Delete = 8
End Enum

Public Sub ShowBitwiseEnum()

    ' Declare the non-exclusive enumeration object and
    ' set it to multiple values.
    Dim perm As FilePermissions
    perm = FilePermissions.Read Or FilePermissions.Update

    ' Show the values in the enumeration object.
    Console.WriteLine(perm.ToString)
    ' Output: Read, Update

    ' Show the total integer value of all values
    ' in the enumeration object.
    Console.WriteLine(CInt(perm))
    ' Output: 6

    ' Show whether the enumeration object contains
    ' the specified flag.
    Console.WriteLine(perm.HasFlag(FilePermissions.Update))
    ' Output: True
End Sub

Exemplo 7

O exemplo a seguir itera por meio de uma enumeração. Ele usa o método GetNames para recuperar uma matriz de nomes de membro da enumeração e GetValues recuperar uma matriz de valores de membro.

Enum EggSizeEnum
    Jumbo
    ExtraLarge
    Large
    Medium
    Small
End Enum

Public Sub Iterate()
    Dim names = [Enum].GetNames(GetType(EggSizeEnum))
    For Each name In names
        Console.Write(name & " ")
    Next
    Console.WriteLine()
    ' Output: Jumbo ExtraLarge Large Medium Small 

    Dim values = [Enum].GetValues(GetType(EggSizeEnum))
    For Each value In values
        Console.Write(value & " ")
    Next
    Console.WriteLine()
    ' Output: 0 1 2 3 4 
End Sub

Confira também