Enumeraciones bit flag

En nuestro que hacer diario es muy normal utilizar enumeraciones con diferentes propósitos, pero pocos conocíamos algunas técnicas especiales de las enumeraciones que permiten aplicar operadores binarios y realizar combinaciones con los valores de la enumeración.

Las enumeraciones como Flags

Usar enumeradores como bit flags es muy útil para hacer combinaciones sin necesidad de crear propiedades distintas para cada configuración. Para poder hacer uso de estas características es necesario “adornar” nuestra enumeración con el atributo [Flags], en el siguiente ejemplo podemos observar como en la misma enumaracion podemos combinar valores siguiendo solo una regla: colocarle valores binarios a los elementos de la enumeración. Ejemplo:


[Flags]

enum Permissions

{

None = 0, //000

Read = 1, //001

Write = 2, //010

Upload = 4, //100

FullControl = Read | Write | Upload //111

}

Console.WriteLine("Enumeration with Flags, None: {0}", Convert.ToInt32(Permissions.None));

Console.WriteLine("Enumeration with Flags, Read: {0}", Convert.ToInt32(Permissions.Read));

Console.WriteLine("Enumeration with Flags, Write: {0}", Convert.ToInt32(Permissions.Write));

Console.WriteLine("Enumeration with Flags, Upload: {0}", Convert.ToInt32(Permissions.Upload));

Console.WriteLine("Enumeration with Flags, FullControl: {0}", Convert.ToInt32(Permissions.FullControl));

Console.WriteLine("---------------------");

Permissions userPermission;

userPermission = Permissions.Read | Permissions.Upload;

Console.WriteLine("User permission: {0}", userPermission);

if ((userPermission & Permissions.Read) == Permissions.Read)

{

Console.WriteLine("Yay!!, I have read permissions...");

}

else

{

Console.WriteLine(":'(, I don't have read permissions...");

}

if ((userPermission & Permissions.Upload) == Permissions.Upload)

{

Console.WriteLine("Yay!!, I have upload permissions...");

}

else

{

Console.WriteLine(":'(, I don't have upload permissions...");

}

if ((userPermission & Permissions.Write) == Permissions.Write)

{

Console.WriteLine("Yay!!, I have write permissions...");

}

else

{

Console.WriteLine(":'(, I don't have write permissions...");

}

Console.ReadKey();

El codigo anterior produce la siguiente salida:

Como ves es muy fácil utilizar este tipo de enumeraciones y muy útiles.

Buenas practicas de enumeraciones

Por ultimo y hablando de enumeraciones hagamos un pequeño listado de mejores practicas para el uso de estas:

Buenas ideas:

  • Prefiere enumeraciones en vez de clases estaticas (No están hechas para eso).
  • Si existe un elemento de la enumeracion “Ninguno” o “None”, asignales valor 0.
  • Aplica el atributo [Flags] cuando vayas a usar bit flags enums.
  • Usa enumeraciones para parametros fuertemente tipados, propiedades o otro tipo de elementos que representen un conjunto de valores.

Malas ideas:

  • Usar enumeraciones que cambian en cada versión del código.
  • Aplicar el atributo [Flags] a las enumeraciones estándar.
  • Mezclar elementos que no guardan relaciones entre si en la misma enumeración.
  • Crear enumeraciones con un solo elemento.
  • Reservar valores para uso futuro.
  • Combinar elementos cuyo valor sea 0 cuando la enumeración es bit flag, puesto que 0 AND X = 0, siempre.

Proco

Software engineer, Gamer, Husband.

También te podría gustar...

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *