Una enumeración (o enum) es un tipo de dato por valor que permite definir un conjunto de constantes simbólicas con nombre. En lugar de trabajar con números “mágicos” o cadenas sueltas, las enumeraciones aportan:
- Legibilidad: el código es más fácil de leer y mantener.
- Seguridad de tipos: el compilador impide usar valores fuera del rango permitido.
- Autocompletado: los IDEs muestran la lista de opciones disponibles.
Firma básica
enum <Nombre> : <tipo subyacente> { Miembro1 = valor1, Miembro2 = valor2, … }
El tipo subyacente puede ser byte
, sbyte
, short
, ushort
, int
(por defecto), uint
, long
o ulong
.
Declaración y uso fundamental
// Declaración
public enum EstadoPedido
{
Pendiente, // 0
Procesando, // 1
Enviado, // 2
Entregado, // 3
Cancelado // 4
}
// Uso
EstadoPedido estado = EstadoPedido.Procesando;
if (estado == EstadoPedido.Enviado)
{
Console.WriteLine("Tu paquete está en camino 🚚");
}
Puntos clave
- Valores predeterminados
Si no asignas un número, el primero es 0 y cada siguiente se incrementa en 1. - Conversión a entero
int codigo = (int)EstadoPedido.Enviado; // 2
- Conversión desde entero
EstadoPedido e = (EstadoPedido)3; // Entregado
Enumeraciones con valores personalizados
Asignar valores explícitos resulta útil cuando:
- Debes mapear un enum a un código externo (p. ej., base de datos).
- Quieres que los valores empiecen por 1 (o cualquier otro número).
public enum RolUsuario : byte
{
Invitado = 1,
Miembro = 2,
Admin = 3,
SuperAdmin= 4
}
Enumeraciones Flags (bit a bit)
Cuando una variable puede almacenar varios estados simultáneamente, se emplea Flags
y potencias de dos:
[Flags]
public enum PermisosArchivo
{
Ninguno = 0,
Leer = 1 << 0, // 1
Escribir = 1 << 1, // 2
Ejecutar = 1 << 2, // 4
// Combinaciones comunes
LecturaEscritura = Leer | Escribir // 3
}
// Uso
PermisosArchivo permisos = PermisosArchivo.Leer | PermisosArchivo.Ejecutar;
bool puedeLeer = permisos.HasFlag(PermisosArchivo.Leer); // true
bool puedeEscribir = permisos.HasFlag(PermisosArchivo.Escribir); // false
Buenas prácticas con Flags
- Incluye siempre
Ninguno = 0
. - Usa
[Flags]
para queToString()
devuelva combinaciones legibles ("Leer, Ejecutar"
). - Asegúrate de que cada miembro simple sea una potencia de dos.
Representación como texto
EstadoPedido estado = EstadoPedido.Enviado;
string texto = estado.ToString(); // "Enviado"
Si necesitas deserializar:
EstadoPedido estado = Enum.Parse<EstadoPedido>("Procesando");
// o bien seguro:
bool ok = Enum.TryParse("Procesando", out EstadoPedido resultado);
Iterar sobre los miembros
foreach (EstadoPedido e in Enum.GetValues<EstadoPedido>())
{
Console.WriteLine($"{(int)e} - {e}");
}
Buenas prácticas generales
Práctica | Por qué |
---|---|
Usa nombres singulares (EstadoPedido , no EstadosPedidos ) | Se utilizan como valores individuales. |
Agrupa lógicamente en un archivo estático o cerca de la entidad relacionada | Mantiene la cohesión del módulo. |
Evita cambiar valores numéricos ya persistidos | Podrías romper datos en BD o serializaciones. |
Añade XML-comments para cada miembro | Mejora la documentación IntelliSense. |
Errores comunes
- Olvidar el sufijo
Enum.Parse<EnumTipo>()
Llamar aEnum.Parse
sin tipo genérico devuelveobject
y hay que castear. - No validar enteros externos
Convertir un número inválido provoca valores no definidos. UsaEnum.IsDefined()
oTryParse
. - Comparar contra números mágicos
Evitaif (estado == 2)
; siempre compara conEstadoPedido.Enviado
.
Conclusión
Las enumeraciones en C# son una herramienta sencilla y potente para dar significado a valores numéricos, aumentar la legibilidad y prevenir errores de lógica. Dominar su sintaxis y variantes —incluidos los enums de flags— te permitirá escribir código más claro, mantenible y seguro. ¡Empieza a reemplazar esos números mágicos por enums y notarás la diferencia enseguida!
Contenido restringido
Comments are closed