564 votes

C # - Liste <T> ou IList <T>

Quelqu'un peut-il m'expliquer pourquoi je voudrais utiliser IList sur List en C #?

Question connexe: Pourquoi est-il jugé mauvais d'exposer List<T>

494voto

tvanfosson Points 268301

Si vous exposer votre classe à travers une bibliothèque que d'autres vont utiliser, vous voulez généralement l'exposer via des interfaces plutôt que des implémentations concrètes. Cela vous aidera si vous décidez de modifier l'implémentation de votre classe ultérieurement pour utiliser une autre classe concrète. Dans ce cas, les utilisateurs de votre bibliothèque n'auront pas besoin de mettre à jour leur code puisque l'interface ne change pas.

Si vous ne l'utilisez qu'en interne, vous ne vous en souciez peut-être pas trop, et l'utilisation de List<T> peut être acceptable.

361voto

Arec Barrwin Points 13151

Le moins populaire réponse est les programmeurs aiment à faire semblant de leur logiciel va être ré-utilisé dans le monde entier, quand en fait, la majorité des projets sera assurée par un petit nombre de personnes et cependant agréable liés à l'interface soundbites êtes, vous êtes un leurre vous-même.

L'Architecture Des Astronautes. Les chances que vous aurez à rédiger votre propre IList qui ajoute quelque chose à ceux qui sont déjà dans le .NET framework sont si éloignées que c'est théorique de la gelée de tots réservés aux "meilleures pratiques".

Software astronauts

Évidemment, si on vous demande qui vous l'utilisez dans une interview, vous dites IList, sourire, toutes deux sont heureux de vous pour être si intelligent. Ou pour une API publique, IList. Nous espérons que vous obtenez mon point de vue.

196voto

Rinat Abdullin Points 13520

L'interface est une promesse (ou un contrat).

Comme toujours avec les promesses - plus c'est petit, mieux c'est .

39voto

ILoveFortran Points 1670

List<T> est une mise en œuvre spécifique de l' IList<T>, ce qui est un conteneur qui peut être abordé de la même manière qu'un tableau linéaire T[] à l'aide d'un index entier. Lorsque vous spécifiez IList<T> comme le type de la méthode de l'argument, vous ne spécifiez que vous avez besoin de certaines fonctionnalités du conteneur.

Par exemple, la spécification de l'interface de ne pas appliquer une structure de données spécifique pour être utilisé. La mise en œuvre de l' List<T> arrive à la même performance d'accès, de suppression et d'ajout d'éléments comme un tableau linéaire. Toutefois, on peut imaginer une mise en œuvre qui est soutenu par une liste liée au lieu de cela, pour lequel l'ajout d'éléments à la fin est moins cher (constante de temps), mais d'accès aléatoire beaucoup plus cher. (Notez que l' .NET LinkedList<T> ne pas mettre en oeuvre IList<T>.)

Cet exemple vous indique également qu'il peut y avoir des situations où vous avez besoin de spécifier la mise en œuvre, et non pas l'interface, dans la liste d'arguments: Dans cet exemple, chaque fois que vous avez besoin d'un accès particulier des caractéristiques de performance. Ceci est garanti pour une mise en œuvre spécifique d'un conteneur (List<T> documentation: "Il met en œuvre l' IList<T> interface générique à l'aide d'un tableau dont la taille est dynamiquement augmenter.").

En outre, vous pourriez envisager de les exposer le moins de fonctionnalités dont vous avez besoin. Par exemple. si vous n'avez pas besoin de modifier le contenu de la liste, vous devriez probablement envisager d'utiliser IEnumerable<T>, IList<T> s'étend.

30voto

Patrik Hägne Points 7735

Je tournerais la question un peu, au lieu de justifier pourquoi vous devriez utiliser l'interface plutôt que l'implémentation concrète, essayez de justifier pourquoi vous utiliseriez l'implémentation concrète plutôt que l'interface. Si vous ne pouvez pas le justifier, utilisez l'interface.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X