jueves, 20 de febrero de 2014

Receta No. 1-18 en C#: Creación de un Tipo Anónimo

Tabla de Contenido

0. Introducción
1. Problema
2. Solución
3. Discusión de la Solución
4. Práctica
5. Conclusiones
6. Glosario
7. Enlaces & Literatura

0. Introducción

Esta receta viene a convertirse en complementaria del artículo var - Variables Locales de Tipo Deducido Implícitamente en C#. Aquí veremos un caso práctico de uso de la construcción var para la declaración o asignación de tipos de manera implícita. Reforzaremos el concepto del enfoque de programación alto nivel gracias al uso de esta construcción. Además, se introducirá la creación y manipulación de tipos de datos de vida útil corta.

1. Problema

Ahora necesitamos crear tipos de datos temporales que nos permita manipular datos sin recurrir a la definición de una nueva clase, o estructura.

2. Solución

Desde la versión 3 [4] de C# la especificación del lenguaje introduce el concepto de variables locales de deducción de tipo implícito: var [2]. Una variable declarada o calificada con este tipo, deduce el tipo de manera implícita a partir del valor generado de la evaluación de la expresión del lado derecho (RValue [5]). Veremos en la extensión que introduce la Discusión de la Solución de la siguiente sección, por ahora ya contamos con la construcción necesaria para resolver nuestro problema.

3. Discusión de la Solución

Ya sabemos que la construcción var fue introducida en la versión 3 de C#. Y es el tipo de dato que nos permite programar en génerico (en abstracto); en el caso particular, deducir y especificar el tipo a partir de la evaluación de una expresión. Por ejemplo:

var x = "OrtizOL";
var y = new System.Text.StringBuilder();
var z = (float)Math.PI;

En la primera expresión, el tipo de dato deducido implícitamente para la variable x es String; para la variable y (StringBuilder [6]), y para z float.

var también es útil para la deducción del tipo de un arreglo. Esto lo logra por medio de la evaluación de los tipos incluidos en la lista comatosa (separada por comas). Veamos:

// a es compilado como un arreglo de enteros (int[])
var a = new[] { 0, 1, 2 };

Así mismo, en conjunción, la construcción de recorrido de colecciones iterables (también se podría decir, transversales) foreach [8] permite deducir el tipo de dato contenido a partir de la colección de elementos (para este caso un arreglo). Así:

foreach(var item in lista)

En los ejemplos que se muestra en la seccion 4 podremos ver con más detalle el uso de var. Mientras tanto les recomiendo leer el artículo var - Variables Locales de Tipo Deducido Implícitamente.

También recomiendo la lectura de esta discusión en StackOverflow: type inference# - Stack Overflow [3]. para profundizar acerca de las situaciones útiles y no aptas de var.

4. Práctica

Veamos un par de ejemplos de uso de var.

4.1 Conversión de Elementos String a Mayúscula y Minúscula


En la línea 16 sencillamente creamos un arreglo de objetos string. Más adelante, en las líneas 20 y 21 hacemos uso de LINQ [8]: marco de trabajo para la construcción de consultas para la recuperación de datos desde una fuente de datos (base de datos, archivo XML, cadena de texto, &c.) (más adelante veremos con detenimiento esta importante característica del lenguaje C#); para convertir a las cadenas en el arreglo palabras a mayúsculas y minúsculas.

En la línea con lo anterior, obsérvese el uso del operador new en la línea 21: con esto logramos crear un tipo de dato anónimo que posee dos propiedades: Mayuscula y Minuscula. Esto ocurre por cada elemento del arreglo palabras.

Finalmente, en las líneas 24 a 27 se recorre el palabras por medio del ciclo for mejorado foreach en conjugación con var. Para entender mejor lo que ocurre hagamos un prueba de ejecución:


Compilación:

  1. csc /target:exe /out:TipoVariableDeducido.exe TipoVariableDeducido.cs

Ejecución desde la consola:

  1. TipoVariableDeducido.exe

4.2 Creación de Tipo Anónimo Exterior y Anidado

Este ejemplo es un adaptación del expuesto en [1].


Veamos con cuidado las líneas 16 a 26:

El operador new frente al operador de asignación, inicia la declaración (forma implícita) y creación de un tipo anónimo. Los miembros:

  • Nombre,
  • Apellido,
  • Edad, y
  • Familia
corresponden con las propiedades del tipo anónimo. Vale adicionar que Familia referencia otro tipo anónimo (a este lo calificamos de anidado debido a que es parte del tipo anónimo exterior). Esta propiedad también almacena las propiedades del tipo anónimo creado, y son:
  • Papa,
  • Mama, y
  • Hermano

Hasta aquí ya tenemos el tipo ánimo referenciado por juan.


Es tiempo de ver cómo podemos acceder a estas propiedades. En las líneas 29 a 34 logramos esto. ¿Cómo accedemos y obtenemos el valor de la propiedad Nombre? Así:

Console.WriteLine ("Nombre: {0}", juan.Nombre)

Generalmente:

identificador.Propiedad

O, ¿cómo accedemos y visualizamos el valor de la propiedad Mama de la propiedad Familia? Así:

Console.WriteLine ("Mamá: {0}", juan.Familia.Mama)

Sencillo, ¿cierto?

Compilemos:


  1. csc /target:exe /out:TipoAnonimoExteriorAnidado.exe TipoAnonimoExteriorAninado.cs

Ejecutemos:


  1. TipoAnonimoExteriorAnidado.exe

► Prueba de ejecución.

Conclusiones

En esta receta aprendimos a crear tipos ánimos utilizando la construcción var. Entendimos su utilidad a través de dos ejemplos en donde se demostró la creación de tipos ánimos a partir de un consulta LINQ (tema que veremos más adelante), e inclusive, cómo crear una propiedad de tipo anónimo como otro tipo de esta misma naturaleza.

Glosario

- Anidado
- Propiedad
- LINQ
- Tipo anónimo
- var

Enlaces & Literatura

[1]: Visual C# 2010 Recipes by Allen Jones and Adam Freeman. Copyright 2010 Allen Jones and Adam Freeman, 978-1-4302-2525-6.
[5]: Value (computer science), the free encyclopedia - https://en.wikipedia.org/wiki/Value_%28computer_science%29
[8]: Getting Started with LINQ in C# - http://msdn.microsoft.com/en-us/library/bb397933.aspx


M

No hay comentarios:

Publicar un comentario

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