Índice
1. Introducción2. Palabras Clave
3. Generalidades
4. Interfaz IList
5. Interfaz Genérica IList<T>
6. Interfaz IReadOnlyList<T>
7. Conclusiones
8. Literatura & Enlaces
1. Introducción
Esta segunda entrega de Interfaces ICollection y IList en C# describe dos interfaces de colecciones: IList y IList<T>. Además, se estudiará la interfaz para tipos genéricos IReadOnlyList<T>; una interfaz para la implementación de colecciones de sólo lectura. Antes de empezar, es necesario dejar evidente que estas interfaces están orientadas a colecciones que acceden a sus elementos a través de un índice.
2. Palabras Clave
- Colección
- Índice
- Lista
- Protocolo
3. Generalidades
Las interfaces IList (no genérica) y IList<T> (genérica) están orientadas para colecciones de elementos que requieren acceder o modificar su contenido por medio de un índice.
Este tipo de colecciones sigue, de forma análoga, el modelo de los arreglos: el acceso a los elementos se reaiza por medio de un índice; tal como se muestra en la siguiente imagen:
Figura 1. Modelo de acceso a elementos por índice ("Learning the Concept of Arrays", 2017). |
4. Interfaz IList
IList ("IList Interface", 2017) es la versión no-genérica de una estructura de datos o colección en la que se accede a los elementos a través de un índice.
Entre las características paticulares de esta interfaz, está la de definir estructuras (Ídem):
- Sólo lectura: la lista no puede ser modificada.
- Tamaño fijo: las operaciones de agregación o remoción no están permitidas, sin embargo los elementos existentes puede ser modificados.
- Tamaño variable: todas las operaciones están permitidas: agregación, remoción y modificación.
Las funciones -propiedades y métodos-, que deben ser implementados desde interfaces son los que se enlistan aquí (Albahari, 2012):
public interface IList : ICollection, IEnumerable
{
object this [int index] {get; set}
bool IsFixedSize { get; }
bool IsReadOnly { get; }
int Add (object value);
void Clear();
bool Contains (object value);
int IndexOf (object value);
void Insert (int index, object value);
void Remove (object value);
void RemoveAt (int index);
}
4. Interfaz Genérica IList<T>
La interfaz o protocolo IList<T> es la versión genérica de una colección donde los elementos se acceden por su índice ("IList(T) Interface", 2017). Hereda los métodos de las interfaces genéricas ICollection<T> ("Interfaces ICollection y IList", 2017) y IEnumerable<T> ("Enumeración e Interfaces IEnumerator(T) e IEnumerable(T)", 2017) para ser implementados en clases concretas.
Los métodos abstractos propios de esta interfaz (Albahari, 2017):
public interface IList<T> : ICollection<T>, IEnumerable<T>, IEnumerable
{
T this [int index] { get; set; }
int IndexOf (T item);
void Insert (int index, T item);
void RemoveAt (int index);
}
Para conocer más detalles técnicos acerca de esta interfaz consultar la documentación oficial: IList Interface (System.Collections).
Vale destacar que el método Add (heredado de ICollection<T>) de IList<T> no retorna un entero sino void. Esta diferencia es importante considerarla a la hora de hacer implementaciones concretas, dado qe podría conducir a confusiones.
5. Interfaz IReadOnlyList<T>
IReadOnlyList<T> ("IReadOnlyList(T) Interface", 2017) es una interfaz que representa una colección basada en índices para acceder a sus elementos, pero que sólo permite la lectura, orden y número de elemenos fijos; las demás operaciones no están permitidas: agregación o remoción.
Como se advierte en Albahari (2012), esta interfaz se introduce para permitir la interoperabilidad de Windows Runtime (C# y Windows Runtime). Su introducción se lleva a cabo sobre la versión 4.5 de .NET Framework.
De acuerdo con su especificación:
public interface IReadOnlyList<out T> : IEnumerable<T>, IEnumerable
{
int Count { get; }
T this[int index] { get; }
}
es importante distinguir que cuenta sólo los miembros necesarios para respetar las condiciones de formación de sólo lectura: conteo de elementos y acceso a los elementos por índice. En vista de lo anterior, se puede decir IReadOnlyList<T> es una versión básica de IList<T>.
Es necesario, además, mencionar respecto a la especificiación de código anterior, que el tipo paramétrico T está marcado como covariante; es decir sólo se permite el retorno de elementos de un tipo concreto; el retorno de valores del tipo paramétrico no está habilitado en este modo de especificación ("out (generic modifier)", 2017): bajo está modalidad no es posible especificar T como tipo de parámetros en métodos o propiedades.
6. Conclusiones
Comprendimos en este artículo cómo distinguir las versiones de IList: no-genérica y su contraparte genérico. También fue fundamental reconocer que este tipo de colección accede a los elementos integrantes a través de un índice (tal como sucede con los arreglos estándar.). Al final del artículo, vimos la interfaz genérica IReadOnlyList<T>: una vista de sólo lectura de IList<T>.
7. Literatura & Enlaces
Albahari, J., Albahari, B. (2012). C# 5.0 in a Nutshell. United States: O'Reilly Media.Learning the Concept of Arrays In Java (2017). Recuperado desde: http://www.javatutorialprograms.com/2015/11/learning-concept-of-arrays-in-java.html
IList Interface (System.Collections) (2017). Recuperado desde: https://msdn.microsoft.com/en-us/library/system.collections.ilist(v=vs.110).aspx
IList(T) Interface (System.Collections.Generic) (2017). Recuperado desde: https://msdn.microsoft.com/en-us/library/5y536ey6(v=vs.110).aspx
Interfaces ICollection y IList en C# - Parte 1/2 (2017). Recuperado desde: https://ortizol.blogspot.com.co/2017/08/interfaces-icollection-y-ilist-en-csharp-parte-1-2.html
Enumeración e Interfaces IEnumerator(T) e IEnumerable(T) en C# (2017). Recuperado desde: https://ortizol.blogspot.com.co/2017/08/enumeracion-e-interfaces-ienumerator-t-e-ienumerable-t-en-csharp.html
IReadOnlyList(T) Interface (System.Collections.Generic) (2017). Recuperado desde: https://msdn.microsoft.com/en-us/library/hh192385(v=vs.110).aspx
C# y Windows Runtime (2017). Recuperado desde: https://ortizol.blogspot.com.co/2013/06/c-y-windows-runtime.html
out (Generic Modifier) (C# Reference) | Microsoft Docs (2017). Recuperado desde: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/out-generic-modifier
O