Para responder a la parte del "por qué" de la pregunta de por qué no List<T>
, los motivos son a prueba de futuro y la simplicidad de la API.
A prueba de futuro
List<T>
no está diseñado para ser fácilmente extensible subclasificándolo; Está diseñado para ser rápido para implementaciones internas. Notará que los métodos en él no son virtuales y, por lo tanto, no pueden anularse, y no hay ganchos en sus operaciones Add
/ Insert
/ Remove
.
Esto significa que si necesita alterar el comportamiento de la colección en el futuro (por ejemplo, para rechazar objetos nulos que las personas intentan agregar, o para realizar un trabajo adicional cuando esto sucede, como actualizar su estado de clase), entonces debe cambiar el tipo de la colección que regresa a una que puede subclasificar, lo que será un cambio de interfaz de última hora (por supuesto, cambiar la semántica de cosas como no permitir nulo también puede ser un cambio de interfaz, pero cosas como actualizar su estado interno de clase no lo serían).
Así que, ya sea mediante la devolución de una clase que puede ser fácilmente subclases tales como Collection<T>
o una interfaz como IList<T>
, ICollection<T>
oIEnumerable<T>
puede cambiar su implementación interna para que sea un tipo de colección diferente para satisfacer sus necesidades, sin romper el código de los consumidores porque aún puede devolverse como el tipo que esperan
Simplicidad API
List<T>
contiene muchas operaciones útiles como BinarySearch
, Sort
etc. Sin embargo, si esta es una colección que está exponiendo, es probable que controle la semántica de la lista, y no los consumidores. Entonces, aunque su clase internamente pueda necesitar estas operaciones, es muy poco probable que los consumidores de su clase quieran (o incluso deberían) llamarlos.
Como tal, al ofrecer una clase o interfaz de colección más simple, reduce la cantidad de miembros que ven los usuarios de su API y les facilita su uso.