Saltar al pie de página
Iron Academy Logo
Aprender C#
Aprender C#

Otras categorías

Entendiendo C# Set Flag Enum: Asignación de Banderas

Tim Corey
9m 57s

Al trabajar con permisos, configuraciones o ajustes en C#, a menudo nos encontramos con situaciones en las que es necesario almacenar varios valores en una única variable. En lugar de utilizar valores booleanos independientes para cada ajuste, podemos utilizar Flag Enums. Este método aprovecha las operaciones binarias para gestionar eficientemente múltiples opciones dentro de un único valor entero.

En este artículo, profundizaremos en cómo establecer Flag Enums en C# basándonos en el vídeo de Tim Corey, Binary in C#: Assigning Flags in 10 Minutes or Less. Tim explica cómo asignar múltiples valores mediante operaciones binarias, haciendo que nuestro código sea más eficiente y legible. Vamos a sumergirnos.

Introducción a los Flag Enums

Tim comienza explicando que esta lección forma parte de una serie sobre la comprensión de binarios en C#. En este vídeo en concreto, se centra en cómo asignar indicadores utilizando operaciones binarias. Los indicadores nos permiten almacenar varios valores en un único número entero, lo que hace que la gestión de permisos sea mucho más sencilla y eficiente.

Asignación de múltiples banderas usando Bitwise OR

Tim demuestra cómo podemos combinar varios permisos utilizando la función bitwise OR (|operador). Él crea una enumeración SystemPermissions que incluye diferentes niveles de permiso como SQL, Redis y BuildSystem. En lugar de utilizar múltiples variables, podemos almacenar todos los permisos en un solo valor.

Ejemplo de asignación de varios permisos a una variable:

// Assume that SystemPermissions is an enum with values SQL, Redis, and BuildSystem
SystemPermissions TimPermissions = SystemPermissions.SQL | SystemPermissions.Redis;

// Print the current permissions - it will include both SQL and Redis
Console.WriteLine(TimPermissions);
// Assume that SystemPermissions is an enum with values SQL, Redis, and BuildSystem
SystemPermissions TimPermissions = SystemPermissions.SQL | SystemPermissions.Redis;

// Print the current permissions - it will include both SQL and Redis
Console.WriteLine(TimPermissions);

Visualización de la representación binaria

Para entender mejor lo que está sucediendo, Tim sugiere convertir el valor entero a su forma binaria usando Convert.ToString(value, 2). Esto nos permite visualizar qué bits están configurados:

// Convert the permissions to a binary string to see the set bits
Console.WriteLine(Convert.ToString((int)TimPermissions, 2));
// Convert the permissions to a binary string to see the set bits
Console.WriteLine(Convert.ToString((int)TimPermissions, 2));

Esto muestra que diferentes posiciones de bits corresponden a diferentes permisos, demostrando cómo podemos almacenar múltiples configuraciones en un entero.

Añadir más permisos con OR-Equals

Tim explica que podemos añadir más permisos de forma dinámica utilizando la función |operador =:

// Add the BuildSystem permission to the existing permissions
TimPermissions |= SystemPermissions.BuildSystem;

// Print the updated permissions - it now includes SQL, Redis, and BuildSystem
Console.WriteLine(TimPermissions);
// Add the BuildSystem permission to the existing permissions
TimPermissions |= SystemPermissions.BuildSystem;

// Print the updated permissions - it now includes SQL, Redis, and BuildSystem
Console.WriteLine(TimPermissions);

Entender el límite de 32 bits

Tim destaca una consideración importante: el tipo de datos entero en C# tiene un límite de 32 bits. Esto significa que solo podemos almacenar hasta 32 banderas únicas en un int. Si necesitamos más de 32 banderas, deberíamos considerar usar un long (64 bits) o incluso múltiples valores. Sin embargo, en la mayoría de los casos, 32 banderas son más que suficientes.

Almacenamiento de indicadores en una base de datos

Una de las mayores ventajas de utilizar flag enums es que pueden almacenarse de forma eficiente en una base de datos. En lugar de almacenar varias columnas booleanas, podemos almacenar un único valor entero que represente todos los permisos. Tim explica que este enfoque reduce significativamente la complejidad de las bases de datos y los requisitos de almacenamiento.

Por ejemplo, si TimPermissions se almacena como 37, representa una combinación de:

  • SQL (bit 1)
  • Redis (bit 3)
  • BuildSystem (bit 5)

Cuando recuperamos este valor de la base de datos, podemos descodificarlo fácilmente para determinar los permisos activos.

Conclusión

Tim concluye haciendo hincapié en el poder de los Flag Enums. Mediante el uso de operaciones binarias, podemos gestionar de forma eficiente múltiples estados dentro de un único número entero. Esta técnica mejora el rendimiento, simplifica el almacenamiento de datos y hace que nuestro código sea más legible.

Siguiendo este enfoque, puede implementar un sistema de gestión de permisos limpio y escalable utilizando C# Flag Enums. Vea el vídeo completo para comprenderlo mejor.

Hero Worlddot related to Entendiendo C# Set Flag Enum: Asignación de Banderas
Hero Affiliate related to Entendiendo C# Set Flag Enum: Asignación de Banderas

Gana más compartiendo lo que te gusta

¿Creas contenidos para desarrolladores que trabajan con .NET, C#, Java, Python o Node.js? ¡Convierte tu experiencia en un ingreso extra!

Equipo de soporte de Iron

Estamos disponibles online las 24 horas, 5 días a la semana.
Chat
Email
Llámame