3. INTRODUCCIÓN A LAS COLECCIONES
Colecciones
Una colección es un tipo de dato que actúa
como un contenedor para un conjunto de
objetos.
Cuando se define un arreglo, se especifica el
tipo de dato que almacena el arreglo y el
tamaño de la arreglo. Una colección es más
flexible ya que al momento de crearla no se
tiene que especificar el tamaño ni el tipo de
dato almacenar.
El .Net Framework define las colecciones en
los Namespace System.Collections y
System.Collections.Generics
4. Colecciones
Existen 2 tipos de Colecciones: Genéricas
y No Genéricas
Colecciones No Genéricas: as
colecciones no genéricas su característica
es que no son fuertemente tipificadas por lo
que almacenan un dato genérico que es
object.
Al momento de almacenar los objetos de
convierten en el tipo object y para obtenerlo
se deben convertir al dato en cuestión.
5. Colecciones No Genéricas Mas Comunes:
ArrayList
Una colección sin orden en los elementos, similar a un arreglo. Los elementos son
obtenidos por índice
Queue
FIFO (first-in, first-out). Primero en entrar primero en salir. Se utiliza el método Enqueue en
vez de Add
Stack
FILO (first-in, last-out). Primero en entrar ultimo en salir. Se utiliza el método Push en vez de
Add
Hashtable
Colección tipo diccionario que almacena los elementos relacionado con llave (key) en vez
de índices.
SortedList
Una colección tipo diccionario, que almacena los elementos ordenados por una llave.
6. Colecciones Genéricas
Son tipos parametrizados soportados por el
CLR
Un tipo parametrizado es aquel que puede
definirse sin especificar los tipos de datos de
sus parámetros en tiempo de compilación.
Nos dan la posibilidad de declarar clases,
estructuras, métodos e interfaces que
actuarán uniformemente sobre valores
cuyos tipos se desconocen a priori y son
recién especificados al momento de su
utilización
7. Generics - Ejemplo
Definiendo una clase genérica en C#
public class ClaseGenerica<T>
{
public T atributo;
}
Utilizando una clase genérica en C#
ClaseGenerica <string> g = new ClaseGenerica<string>();
g.atributo = “Un string";
g.atributo = 2; //Genera Error de Compilación
…
ClaseGenerica<int> g2 = new ClaseGenerica<int>();
g2.atributo = 2; //NO genera error de compilación
10. Ejercicios
Desarrollar un programa que guarde y lea de un
archivo los siguientes dato: Cedula, Nombre,
Apellido, Teléfono, Fecha Nacimiento. El programa
debe utilizar una estructura con los datos descritos
anteriormente y también una colección para
administrar los registros en memoria, es decir que
no existe un máximo de registros. El programa
debe permitir: Agregar, borrar y buscar (por
cedular) los registros almacenados el archivo. A
inicio del programa debe leer del archivo para
cargarlos en la colección.
Notas del editor
Module 12: Using Collections and Building Generic Types Course 10266A
El .NET Framework 2.0 introduce el concepto de generics, permitiendo la creación de código más flexible y reutilizable. Por generics en realidad se entiende a una característica del CLR que permite declarar clases, estructuras, interfaces y métodos sin especificar en tiempo de compilación los tipos de datos que almacenan o utilizan, y especificando en su lugar parámetros “genéricos”. Los tipos reales de los datos se especifican cuando el tipo genérico es utilizado y no cuando es declarado, permitiendo definirlo una única vez y utilizarlo muchas veces con parámetros de distinto tipo. Generics está soportado directamente por el CLR, aunque sólo se puede hacer uso de esta característica desde Visual Basic.NET, C# y C++ .NET. Para obtener más información acerca de generics puede consultarse el siguiente sitio web: http://msdn2.microsoft.com/en-us/library/ms172193.aspx La misma información se encuentra disponible en la siguiente sección del .NET Framework 2.0 SDK: .NET Framework > Core Development Technologies > Development Fundamentals > Generics
Al definir una clase genérica especificamos un contenedor, o parámetro de tipo genérico, para los tipos de dato que ésta almacenará y utilizará. Este parámetro de tipo genérico se identifica con la letra “T”. Al crear una instancia de una clase genérica se debe especificar el tipo de dato real que será utilizado en lugar del parámetro de tipo genérico. De esta forma, el tipo de dato que definamos al instanciar la clase genérica reemplazará al tipo genérico en todos los lugares donde éste aparezca. Para ver más ejemplos sobre el uso práctico de generics es recomendable revisar el código fuente de la aplicación de referencia que acompaña el presente módulo del curso.
El .NET Framework 2.0 incluye en el namespace System.Collections.Generic una serie de colecciones genéricas que, siempre que sea posible, deberían ser utilizadas en lugar de sus equivalentes de System.Collections. En la tabla se pueden ver las nuevas colecciones e interfaces genéricas, junto con sus equivalentes no genéricas del namespace System.Collections. Las colecciones de System.Collections están preparadas para recibir y devolver un System.Object (clase base de todas las clases .NET), y dejan a responsabilidad de los desarrolladores el casteo al tipo de dato correspondiente al obtener un elemento determinado. Las colecciones genéricas, en cambio, son fuertemente tipadas, ya que al momento de instanciarse se define el tipo de dato de los objetos que almacenará, y el compilador hace uso de esa definición para permitir insertar y obtener solamente elementos de ese tipo sin tener que realizar ninguna conversión.
Las dos desventajas principales de la utilización de de colecciones no genéricas son: Performance : como almacenan System.Object, cualquier tipo por referencia que agregue a la colección será casteado automáticamente a un Object, y cualquier tipo por valor deberá ser convertido su correspondiente tipo por referencia para ser casteado luego a Object (a esta operación se la conoce como Boxing). Los casteos y operaciones de boxing/unboxing necesarias para insertar y obtener elementos de las colecciones no genéricas tienen un impacto negativo en la performance de las mismas. Falta de validación en tiempo de compilación : al almacenar objetos de tipo System.Object, no hay forma de que el compilador valide que los datos que se están insertando en una colección sean válidos para la aplicación. Estos dos problemas se solucionan, como se puede apreciar en el ejemplo de código fuente, con el uso de las colecciones genéricas.