viernes, 23 de mayo de 2014

Tipos Genéricos en C# - Parte 7: Arreglos

Tabla de Contenido

0. Introducción
1. Genéricos y Arreglos
1.1 Clase abstracta Array
2. Método genérico con arreglo y List<T>
3. Conclusiones
4. Glosario
5. Literatura & Enlaces

0. Introducción

Aunque pueda resultar breve la descripción de los arreglos en genéricos, es importante hacer mención de sus características genéricas y otras particularidades de este tipo de construcción, en tiempo de ejecución. Veremos varias de las propiedades de los arreglos que facilitan su generalización (al igual que otras estructuras como List<T>), de este modo realizar las operaciones de enumeración o iteración de los elementos, por ejemplo, en un ciclo foreach.

1. Genéricos y Arreglos

Existe un grado de compatibilidad entre estructuras de datos básicas como los arreglos (cfr. Arreglos en C#) y las colecciones (para poner como caso List<T>), eso gracias a que a partir de C# 2.0 los arreglos implementan la interfaz genérica (Interfaces Genéricas) IList<T> [5]. (La implementación de esta interfaz ocurre de forma automática (según [2]).)

Gracias a la anterior propiedad, podemos definir métodos genéricos para explorar (iterar) el contenido de arreglos y colecciones. Sin embargo, hay que tener claro que varios de los métodos abstractos disponibles de la interfaz genérica IList<T> no están disponibles, como: Add, ClearRemoveAt, entre muchos más. El intento de invocación sobre uno de estos métodos, generará el error CS1061 [6].

1.1 Clase abstracta Array

La clase abstracta Array [7] posee la siguiente firma declarativa:
Declaración clase abstract Array
Figura 1. Declaración clase abstracta Sytem.Array [7].

Observemos que no aparece especificada la interfaz genérica IList<T> esto se debe al argumento que nos dan en [7]:
The Array class the base class for language implementations thtat support arrays. However, only the system and compilers can derive explicitly from the Array class. Users should employ the array constructs provided by the language.
Otra advertencia importante que hacen en [7], aclara que la clase Array además de implementar a IList<T>, también implementa a la interfaces genéricas ICollection<T> [8], y IEnumerable;T> [9]; sin embargo todo esto ocurre en tiempo de ejecución. Nota original:
Nota importante acerca de la clase abstracta Array
Figura 2. Nota importante acerca de la clase abstracta Array [7].

2. Método genérico con arreglo y List<T>

Veamos un programa ejemplo en donde se demuestra el grado de genericidad (o generalización) entre una construcción de Array y instancia de la clase genérica IList<T>:

Archivo GeneralizacionArrayList.cs:

Observemos que en las líneas 24-31 hemos declarado declaro el método genérico IterarElementos<T> que recibe como argumento una instancia de la interfaz genérica IList<T>. Esta definición permite y facilita que podamos pasar una instancia de un arreglo (clase Array) o una instancia de la clase genérica (IList<T>).

> Prueba de ejecución.

Resultados:
Elementos de la estructura:
 9
 8
 7
 6
 5

Elementos de la estructura:
 0
 1
 2
 3
 4

3. Conclusiones

La clase Array además de abstracta posee otras características sobresaliente y extrañas: es implementada detrás de cámaras en tiempo de ejecución por otras construcciones. Sin embargo, lo anterior permite que siga el concepto de generalización. Pudimos comprobar que esto es así, en el ejemplo de la sección 2: pasamos a un método genérico una instancia de arreglo, y una instancia de la clase genérica List<T> para visualizar (iterar) sus elementos de datos.

4. Glosario

  • Arreglo
  • Colección
  • Estructura de datos
  • Generalización
  • Genericidad

5. Literatura & Enlaces

[1]: C# 5.0 in a Nutshell by Joseph Albahari and Ben Albahari. Copyright 2012 Joseph Albahari and Ben Albahari, 978-1-449-32010-2.
[2]: Generics and Arrays (C# Programming Guide) - http://msdn.microsoft.com/en-us/library/ms228502.aspx
[3]: Arreglos en C# | OrtizOL - Experiencias Construcción Software (xCSw) - http://ortizol.blogspot.com/2013/09/arreglos-en-c.html
[4]: Tipos Genéricos en C# - Parte 5: Interfaces Genéricas - http://ortizol.blogspot.com/2014/05/interfaces-en-c-parte-5.html
[5]: IList(T) Interface (System.Collections.Generic) - http://msdn.microsoft.com/en-us/library/5y536ey6(v=vs.110).aspx
[6]: Compiler Error CS1061 - http://msdn.microsoft.com/en-us/library/bb383961.aspx
[7]: Array Class (System) - http://msdn.microsoft.com/en-us/library/vstudio/system.array
[8]: ICollection(T) Interface (System.Collections.Generic) - http://msdn.microsoft.com/en-us/library/92t2ye13(v=vs.110).aspx
[9]: IEnumerable(T) Interface (System.Collections.Generic) - http://msdn.microsoft.com/en-us/library/9eekhta0(v=vs.110).aspx


J

No hay comentarios:

Publicar un comentario

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