Enumeraciones



  Una enumeración o tipo enumerado es un tipo especial de estructura en la que los literales de los valores que pueden tomar sus objetos se indican explícitamente al definirla. Por ejemplo, una enumeración de nombre Tamaño cuyos objetos pudiesen tomar los valores literales Pequeño, Mediano o Grande se definiría así:

 enum Tamaño
 {
  Pequeño,
  Mediano,
  Grande
 }  
 
 
Para entender bien la principal utilidad de las enumeraciones vamos a ver antes un problema muy típico en programación: si queremos definir un método que pueda imprimir por pantalla un cierto texto con diferentes tamaños, una primera posibilidad sería dotarlo de un parámetro de algún tipo entero que indique el tamaño con el que se desea mostrar el texto. A estos números que los métodos interpretan con significados específicos se les suele denominar números mágicos, y su utilización tiene los inconvenientes de que dificulta la legibilidad del código (hay que recordar qué significa para el método cada valor del número) y su escritura (hay que recordar qué número ha pasársele al método para que funcione de una cierta forma)
    Una alternativa mejor para el método anterior consiste en definirlo de modo que tome un parámetro de tipo Tamaño para que así el programador usuario no tenga que recordar la correspondencia entre tamaños y números. Véase así como la llamada (2) del ejemplo que sigue es mucho más legible que la (1):


 obj.MuestraTexto(2);                   // (1) 
 obj.MuestraTexto(Tamaño.Mediano);      // (2)  
 

Además, estos literales no sólo facilitan la escritura y lectura del código sino que también pueden ser usados por herramientas de documentación, depuradores u otras aplicaciones para sustituir números mágicos y mostrar textos muchos más legibles.

Por otro lado, usar enumeraciones también facilita el mantenimiento del código. Por ejemplo, si el método (1) anterior se hubiese definido de forma que 1 significase tamaño pequeño, 2 mediano y 3 grande, cuando se quisiese incluir un nuevo tamaño intermedio entre pequeño y mediano habría que darle un valor superior a 3 o inferior a 1 ya que los demás estarían cogidos, lo que rompería el orden de menor a mayor entre números y tamaños asociados. Sin embargo, usando una enumeración no importaría mantener el orden relativo y bastaría añadirle un nuevo literal.

Otra ventaja de usar enumeraciones frente a números mágicos es que éstas participan en el mecanismo de comprobación de tipos de C# y el CLR. Así, si un método espera un objeto Tamaño y se le pasa uno de otro tipo enumerado se producirá, según cuando se detecte la incoherencia, un error en compilación o una excepción en ejecución. Sin embargo, si se hubiesen usado números mágicos del mismo tipo en vez de enumeraciones no se habría detectado nada, pues en ambos casos para el compilador y el CLR serían simples números sin ningún significado especial asociado.


  
 Definicion de Enumeraciones

Ya hemos visto un ejemplo de cómo definir una enumeración. Sin embargo, la sintaxis completa que se puede usar para definirlas es:


 enum <nombreEnumeración> : <tipoBase>
 {
  <literales>
 } 
 
 
 
En realidad una enumeración es un tipo especial de estructura (luego System.ValueType será tipo padre de ella) que sólo puede tener como miembros campos públicos constantes y estáticos. Esos campos se indican en , y como sus modificadores son siempre los mismos no hay que especificarlos (de hecho, es erróneo hacerlo)

El tipo por defecto de las constantes que forman una enumeración es int, aunque puede dárseles cualquier otro tipo básico entero (byte, sbyte, short, ushort, uint, int, long o ulong) indicándolo en <tipoBase>. Cuando se haga esto hay que tener muy presente que el compilador de C# sólo admite que se indiquen así los alias de estos tipos básicos, pero no sus nombres reales (System.Byte, System.SByte, etc.)
Si no se especifica valor inicial para cada constante, el compilador les dará por defecto valores que empiecen desde 0 y se incrementen en una unidad para cada constante según su orden de aparición en la definición de la enumeración. Así, el ejemplo del principio del tema es equivalente a:

 

 enum Tamaño:int
 {
  Pequeño = 0,
  Mediano = 1,
  Grande = 2
 }
 
 
 
 
 

  

 

 

 


 

No hay comentarios:

Publicar un comentario