Sei sulla pagina 1di 5

Enumeraciones: Constantes agrupadas

Una enumeracin es una serie de constantes que estn relacionadas entre s. La utilidad de las enumeraciones es ms manifiesta cuando queremos manejar una serie de valores constantes con nombre, es decir, podemos indicar un valor, pero en lugar de usar un literal numrico, usamos un nombre, ese nombre es, al fin y al cabo, una constante que tiene un valor numrico. En Visual C# 2005 las enumeraciones pueden ser de cualquier tipo numrico integral, incluso enteros sin signo, aunque el valor predefinido es el tipo int. Podemos declarar una enumeracin de varias formas: 1- Sin indicar el tipo de datos, por tanto sern de tipo int:
enum Colores { Rojo = 1, Verde = 2, Azul = 4 };

2- Indicando el tipo de datos que realmente tendr:


enum ColoresByte : byte { Rojo = 1, Verde = 2, Azul = 4 };

En este segundo caso, el valor mximo que podemos asignar a los miembros de una enumeracin ser el que pueda contener un tipo de datos de tipo byte. 3- Indicando el atributo FlagsAttibute, (realmente no hace falta indicar el sufijo Attribute cuando usamos los atributos) de esta forma podremos usar los valores de la enumeracin para indicar valores que se pueden "sumar" o complementar entre s, pero sin perder el nombre, en breve veremos qu significa esto de "no perder el nombre".
[Flags()] enum ColoresFlags : byte {

Rojo = 1, Verde = 2, Azul = 4 };

Nota: Los atributos los veremos con ms detalle en otra leccin de este mismo mdulo.

El nombre de los miembros de las enumeraciones


Tanto si indicamos o no el atributo Flags a una enumeracin, la podemos usar de esta forma:
Colores c = Colores.Azul | Colores.Rojo;

Es decir, podemos "sumar" los valores definidos en la enumeracin. Como hemos comentado, las enumeraciones son constantes con nombres, pero en C# esta definicin llega ms lejos, de hecho, podemos saber "el nombre" de un valor de una enumeracin, para ello tendremos que usar el mtodo ToString(), (que como ya comentamos, se usa para convertir en una cadena cualquier valor numrico). Por ejemplo, si tenemos la siguiente asignacin:
string s1 = Colores.Azul.ToString();

La variable s1 contendr la palabra "Azul" no el valor "4". Esto es aplicable a cualquier tipo de enumeracin, se haya o no usado el atributo FlagsAttribute. Una vez aclarado este comportamiento de las enumeraciones en C#, veamos que es lo que ocurre cuando sumamos valores de enumeraciones a las que hemos aplicado el atributo Flags y a las que no se lo hemos aplicado. Empecemos por este ltimo caso. Si tenemos este cdigo:
enum Colores : byte { Rojo = 1,

Verde = 2, Azul = 4 };

Colores c = Colores.Azul | Colores.Rojo;

string s = c.ToString();

El contenido de la variable s ser "5", es decir, la representacin numrica del valor contenido: 4 + 1, ya que el valor de la constante Azul es 4 y el de la constante Rojo es 1. Pero si ese mismo cdigo lo usamos de esta forma (aplicando el atributo Flags a la enumeracin):
[Flags()] enum Colores : byte { Rojo = 1, Verde = 2, Azul = 4 };

Colores c = Colores.Azul | Colores.Rojo;

string s = c.ToString();

El contenido de la variable s ser: "Rojo, Azul", es decir, se asignan los nombres de los miembros de la enumeracin que intervienen en ese valor, no el valor "interno".

Los valores de una enumeracin no son simples nmeros


Como hemos comentado, los miembros de las enumeraciones realmente son valores de un tipo de datos entero (en cualquiera de sus variedades).

Por tanto, podemos pensar que podemos usar cualquier valor para asignar a una variable declarada como una enumeracin, al menos si ese valor est dentro del rango adecuado. Pero en C# esto no es posible, al menos si lo hacemos de forma "directa", ya que recibiremos un error indicndonos que no podemos convertir, por ejemplo, un valor entero en un valor del tipo de la enumeracin. En la figura 2.3 podemos ver ese error al intentar asignar el valor 3 a una variable del tipo Colores (definida con el tipo predeterminado int).

Figura 2.3. Error al asignar un valor "normal" a una variable del tipo Colores

El error nos indica que no podemos realizar esa asignacin, adems de darnos una pista de que es lo que debemos hacer: convertirlo explcitamente por medio de un "cast". En este caso, la conversin que tenemos que hacer es del tipo Colores al tipo int, por tanto, nuestro cdigo quedara de esta forma:
Colores c1 = ((Colores)3);

Si compilamos y ejecutamos la aplicacin, sta funcionar correctamente. Aunque es posible que usando ese cast no asignemos un valor dentro del rango permitido. En este caso, el valor 3 podramos darlo por bueno, ya que es la suma de 1 y 2 (Rojo y Verde), pero que pasara si el valor asignado es, por ejemplo, 15? En teora no deberamos permitirlo. Estas validaciones podemos hacerlas de dos formas: 1- Con la clsica solucin de comprobar el valor indicado con todos los valores posibles. 2- Usando la funcin IsDefined de la clase Enum de .NET Framework. Esa funcin devolver un valor verdadero o falso dependiendo de que el valor que contiene una variable est o no definido en la enumeracin. En el siguiente ejemplo vemos cmo podemos hacer esa comprobacin:
if( Enum.IsDefined(typeof(Colores), c) == false ) { c = Colores.Azul; } // seguimos con el resto del cdigo

Este cdigo lo que hace es comprobar si el tipo de datos Colores tiene definido el valor contenido en la variable c, en caso de que no sea as, usamos un valor predeterminado.

Nota: La funcin IsDefined slo comprueba los valores que se han definido en la enumeracin, no las posibles combinaciones que podemos conseguir sumando cada uno de sus miembros, incluso aunque hayamos usado el atributo FlagsAttribute.

Potrebbero piacerti anche