Para responder à parte "por que" da pergunta e por que não List<T>
, os motivos são a prova do futuro e a simplicidade da API.
À prova de futuro
List<T>
não foi projetado para ser facilmente extensível subclassificando-o; Ele foi projetado para ser rápido para implementações internas. Você notará que os métodos nele não são virtuais e, portanto, não podem ser substituídos, e não há ganchos em suas operações Add
/ Insert
/ Remove
.
Isso significa que, se você precisar alterar o comportamento da coleção no futuro (por exemplo, para rejeitar objetos nulos que as pessoas tentam adicionar ou executar trabalhos adicionais quando isso acontecer, como atualizar o estado da classe), será necessário alterar o tipo da coleção, você retorna para uma subclasse que pode ser quebrada, o que será uma mudança na interface (é claro que mudar a semântica de coisas como não permitir nulo também pode ser uma alteração na interface, mas coisas como atualizar o estado da classe interna não seriam).
Portanto, retornando uma classe que possa ser facilmente subclassificada Collection<T>
ou uma interface como IList<T>
, ICollection<T>
ou IEnumerable<T>
você pode alterar sua implementação interna para ser um tipo de coleção diferente para atender às suas necessidades, sem quebrar o código dos consumidores, pois ainda pode ser retornado como o tipo que eles estão esperando.
Simplicidade da API
List<T>
contém uma série de operações úteis, tais como BinarySearch
, Sort
e assim por diante. No entanto, se esta é uma coleção que você está expondo, é provável que você controle a semântica da lista, e não os consumidores. Portanto, embora sua classe internamente precise dessas operações, é muito improvável que os consumidores da sua classe desejem (ou até devam) chamá-las.
Dessa forma, ao oferecer uma classe ou interface de coleção mais simples, você reduz o número de membros que os usuários da sua API veem e facilita o uso deles.