domingo, 24 de julio de 2016

Enumeraciones en C# - Tópicos Avanzados - Parte 4/4 | Enumeraciones y la CLR

Índice

1. Introducción
2. Palabras Clave
3. Funcionamiento de Enumeraciones
3.1 Generalidades
3.2 Semántica
4. Conclusiones
5. Literatura & Enlaces

1. Introducción

Esta última parte de la serie Enumeraciones en C# - Tópicos Avanzados se discute el funcionamiento de las enumeraciones al interior de la CLR (Common Language Runtime). Se ilustra la representación interna de los miembros de una enumeración, tratamiento semántico de enumeraciones, valores esperados y los actuales obtenidos en la manipulación de instancias de este tipo de dato.

2. Palabras Clave

  • CLR
  • Compilador
  • Enumeración
  • Miembro

3. Funcionamiento Enumeraciones

3.1 Generalidades

El modo de operación -o semántica- de una enumeración está determinado por el mismo compilador del lenguaje. A esto se añade que la CLR (Common Language Runtime), internamente no hace distinción entre la instancia de una enumeración, ya sea integrada o personalizada, y el valor numérico entero adyacente a ésta (Albahari, 2012).

Continuando, para la CLR una enumeración no es más que un subtipo de dato de la clase System.Enum ("Enum Class", 2016) con un conjunto definido de campos de tipo entero para representar cada miembro o constante de la enumeración ("Albahari, 2012). Este modo operativo y de representación de una enumeración conlleva a una ganancia de rendimiento frente al costo computacional de asociación de constantes enteras en tiempo de ejecución.

3.2 Semántica

La CLR no posee un mecanismo semántico para la gestión de operaciones sobre los miembros de una enumeración. Por ejemplo este código no produce ningún error: 

En las líneas 9-15 se declara la enumeración Lados con cuatro miembros que representan los lados, por ejemplo, de una figura geométrica. Con la línea 3 en Main se obtiene le valor de la constante Lados.Izquierdo; enseguida, línea 4, se especifica la expresión aritmética compuesta para sumar 64 al valor actual de i. Esta operación no produce ningún error a pesar de que se trata de un miembro que semánticamente pertenece a una enumeración.


Lo anterior constituye una desventaja ya que la CLR no mantiene la seguridad de tipos [Seguridad de Tipos en C#]; es decir, se esperaría que en tiempo de ejecución se generará una excepción para mantener la consistencia sobre la manipulación de los miembros de la enumeración (Albahari, 2012).


Por otro lado, a pesar que se ha declarado que no existe diferencia entre una instancia de una enumeración y su valor entero subyacente, este código de ejemplo no resulta consistente: 

Console.WriteLine(Lados.Izquierdo.ToString()); // Izquierdo
Console.WriteLine(Lados.Izquierdo.GetType()); // Lados


En la primera expresión el programador esperaría 1, y en la segunda Int32, pero como se observa esto no es así. En Albahari (2012) sustentan que esto ocurre a razón de: 
"The reason for its behavior is down to some more compile-time trickery. C# explicitly boxes an Enum instance before calling its virtual methods -such as ToString and GetType. And when an Enum instance is boxed, it gains a runtime wrapping that references its Enum type."
Esto se puede interpretar como: ~Cuando una instancia de tipo Enum es manipulada en tiempo de ejecución se mantiene su semántica a través del mecanismo boxing que aplica C# sobre la enumeración.

4. Conclusiones

Se han estudiado varios temas avanzados en el uso de enumeraciones en C#: representación, conversión, acceso a miembros miembros de una enumeración, y finalmente cómo la CLR manipula internamente un objeto de este tipo.

En el siguiente artículo el programador aprenderá acerca de tuplas: un conjunto genérico de clases introducidas en .NET Framework 4.0.

5. Literatura & Enlaces

Albahari, J., Albahari, B. (2012). C# 5.0 in a Nutshell. United States: O'Reilly Media.
Enum Class (System) (2016, julio 24). Recuperado desde: https://msdn.microsoft.com/en-us/library/system.enum(v=vs.110).aspx


O

No hay comentarios:

Publicar un comentario

Envíe sus comentarios, dudas, sugerencias, críticas. Gracias.