csharp-enumeraciones

Qué son y cómo usar las enumeraciones en C#

Una enumeración es un tipo de valor definido por el usuario que consiste en un conjunto de constantes con nombre (cada elemento lo llamaremos como ‘miembros’ de la enumeración).

Cada miembro de la enumeración es una constante que representa un valor entero único, comenzando desde 0 por defecto y aumentando en uno para cada miembro subsecuente.

Definición de una enumeración

Para definir una enumeración en C#, se utiliza la palabra clave enum seguida del nombre de la enumeración y un bloque que contiene los miembros de la enumeración:

enum DiasDeLaSemana
{
    Lunes,
    Martes,
    Miércoles,
    Jueves,
    Viernes,
    Sábado,
    Domingo
}

En este ejemplo, DiasDeLaSemana es una enumeración con siete miembros: Lunes, Martes, Miércoles, Jueves, Viernes, Sábado y Domingo.

Enumeraciones con valores específicos

Es posible asignar valores específicos a los miembros de una enumeración en lugar de utilizar los valores predeterminados.

De este modo, se puede empezar la enumeración en un valor diferente de 0 y asignar valores personalizados a cada miembro.

Por ejemplo, supongamos queremos enumerar los meses, pero que no empiecen por 0. Podríamos asignar un int cualquier a cada valor de la Enum así.

enum DiasSemana
{
    Lunes = 1,
    Martes = 2,
    Miércoles = 3,
    Jueves = 4,
    Viernes = 5,
    Sábado = 6,
    Domingo = 7
}

Si los números son correlativos, podemos numerar únicamente el primero de ellos, y el resto serán correlativos

enum DiasSemana
{
    Lunes = 1,
    Martes,
    Miércoles,
    Jueves,
    Viernes,
    Sábado,
    Domingo
}

Uso de las enumeraciones

Asignación de valores

Una vez definida una enumeración, se pueden declarar variables de ese tipo y asignarles uno de los valores definidos en la enumeración:

DiasDeLaSemana hoy = DiasDeLaSemana.Lunes;

Comparación de valores

También se pueden comparar estos valores utilizando operadores de igualdad:

if (hoy == DiasDeLaSemana.Lunes)
{
    Console.WriteLine("Hoy es lunes.");
}

Conversión de enumeraciones

Las enumeraciones en C# se basan en tipos de datos enteros, por lo que es posible convertir entre una enumeración y su tipo subyacente, que por defecto es int.

int valorNumerico = (int)DiasDeLaSemana.Miércoles;
Console.WriteLine(valorNumerico); // Salida: 2
DiasDeLaSemana dia = (DiasDeLaSemana)4;
Console.WriteLine(dia); // Salida: Viernes

Iterando sobre los valores de una enumeración

En ocasiones, puede ser útil iterar sobre los valores de una enumeración. Para hacer esto, se puede utilizar el método estático Enum.GetValues() que devuelve un arreglo con todos los valores de la enumeración. A continuación, se muestra un ejemplo:

foreach (MesesAño mes in Enum.GetValues(typeof(MesesAño)))
{
   Console.WriteLine(mes);
}

En este ejemplo, se itera sobre todos los valores de la enumeración MesesAño y se imprime cada uno de ellos en la consola.

Ejemplos prácticos

Uso en una aplicación de tareas

Supongamos que estamos desarrollando una aplicación para gestionar tareas y queremos utilizar enumeraciones para representar el estado de una tarea:

enum EstadoTarea
{
    Pendiente,
    EnProgreso,
    Completada,
    Cancelada
}

class Tarea
{
    public string Nombre { get; set; }
    public EstadoTarea Estado { get; set; }

    public void MostrarEstado()
    {
        Console.WriteLine($"La tarea '{Nombre}' está en estado: {Estado}");
    }
}

class Program
{
    static void Main()
    {
        Tarea tarea = new Tarea
        {
            Nombre = "Estudiar para el examen",
            Estado = EstadoTarea.EnProgreso
        };

        tarea.MostrarEstado(); // Salida: La tarea 'Estudiar para el examen' está en estado: EnProgreso
    }
}

Uso en un juego

En el desarrollo de juegos, las enumeraciones pueden ser útiles para representar diferentes tipos de objetos o estados del juego:

enum TipoDeEnemigo
{
    Goblin,
    Orco,
    Dragón
}

class Enemigo
{
    public TipoDeEnemigo Tipo { get; set; }

    public void MostrarTipo()
    {
        Console.WriteLine($"Este enemigo es un: {Tipo}");
    }
}

class Program
{
    static void Main()
    {
        Enemigo enemigo = new Enemigo
        {
            Tipo = TipoDeEnemigo.Dragón
        };

        enemigo.MostrarTipo(); // Salida: Este enemigo es un: Dragón
    }
}