Da trilha de C# Este conceito ainda não saiu como card do dia. ir para o card de hoje

C# Tipos Intermediário

Enums

Um enum (enumeração) é um tipo de valor que define um conjunto de constantes nomeadas, tornando o código mais legível e seguro. Em C#, enums são declarados com a palavra-chave enum e podem ter um tipo subjacente (por padrão int). Cada membro recebe um valor inteiro automático, começando em 0, mas você pode atribuir valores explícitos.

Enums são ideais para representar opções mutuamente exclusivas, como dias da semana, estados de um pedido ou níveis de log. Com o atributo [Flags], um enum pode representar combinações de opções usando operações bit a bit (OR, AND, XOR), permitindo armazenar múltiplos valores em uma única variável.

Converter entre enums e seus tipos subjacentes é feito com casts explícitos ((int), (MeuEnum)valor). A classe Enum fornece métodos úteis como Enum.Parse, Enum.TryParse, Enum.GetValues e Enum.GetNames. Em instruções switch, enums são frequentemente usados para ramificar o fluxo de forma clara e exaustiva.

Pontos-chave

  • enum define um conjunto de constantes nomeadas com valores inteiros subjacentes.
  • O atributo [Flags] permite combinar membros com operadores bit a bit (|, &, ^).
  • Conversões entre enum e inteiro exigem cast explícito; strings usam Enum.Parse ou Enum.TryParse.
  • switch com enum é mais legível e seguro que comparar inteiros ou strings.
  • Use Enum.GetValues e Enum.GetNames para iterar sobre os membros de um enum.
EnumsDemo.cs
using System;

[Flags]
enum Permissoes
{
    Nenhuma = 0,
    Ler = 1 << 0,    // 1
    Escrever = 1 << 1, // 2
    Executar = 1 << 2  // 4
}

enum StatusPedido
{
    Pendente,
    Processando,
    Enviado,
    Entregue
}

class Program
{
    static void Main()
    {
        // Conversão de string para enum
        StatusPedido status = (StatusPedido)Enum.Parse(typeof(StatusPedido), "Enviado");
        Console.WriteLine($"Status: {status} ({(int)status})");

        // Switch com enum
        switch (status)
        {
            case StatusPedido.Pendente:
                Console.WriteLine("Aguardando processamento.");
                break;
            case StatusPedido.Enviado:
                Console.WriteLine("Pedido a caminho!");
                break;
            default:
                Console.WriteLine("Status desconhecido.");
                break;
        }

        // Flags: combinando permissões
        Permissoes p = Permissoes.Ler | Permissoes.Escrever;
        Console.WriteLine($"Permissões: {p}");
        Console.WriteLine($"Pode ler? {p.HasFlag(Permissoes.Ler)}");
        Console.WriteLine($"Pode executar? {p.HasFlag(Permissoes.Executar)}");

        // Iterando sobre valores do enum
        foreach (StatusPedido s in Enum.GetValues(typeof(StatusPedido)))
        {
            Console.WriteLine($"- {s}");
        }
    }
}

Exercícios

  1. 1
    Fácil

    Dia da semana com switch

    Crie um enum DiaSemana com os dias de segunda a domingo. Leia um número inteiro de 1 a 7 e converta para o enum correspondente (1 = Segunda, ..., 7 = Domingo). Use switch para imprimir se é dia útil ou fim de semana.

    Resolver
  2. 2
    Médio

    Permissões com Flags

    Defina um enum [Flags] Permissao com os valores Nenhuma = 0, Ler = 1, Escrever = 2, Executar = 4. Crie um método que recebe uma combinação de permissões e imprime quais estão ativas. No Main, teste com Ler | Executar e depois remova Executar usando XOR (^).

    Resolver
  3. 3
    Desafio

    Máquina de estados com enums

    Modele uma máquina de estados para um pedido usando um enum EstadoPedido com os valores Novo, Processando, Enviado, Entregue, Cancelado. Implemente um método Transicionar(EstadoPedido atual, string acao) que retorna o próximo estado com base nas ações "processar", "enviar", "entregar" e "cancelar". Regras: de Novo pode processar ou cancelar; de Processando pode enviar ou cancelar; de Enviado pode entregar; Entregue e Cancelado são finais. No Main, simule uma sequência de ações e imprima cada transição.

    Resolver

Continue estudando