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
enumdefine 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.ParseouEnum.TryParse. switchcom enum é mais legível e seguro que comparar inteiros ou strings.- Use
Enum.GetValueseEnum.GetNamespara iterar sobre os membros de um enum.
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}");
}
}
}