domingo, 27 de agosto de 2017

Interfaces ICollection y IList en C# - Parte 2/2

Índice

1. Introducción
2. 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:
Modelo de acceso a elementos por índice
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

No hay comentarios:

Publicar un comentario

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