127 votes

Dois-je toujours retourner IEnumerable <T> au lieu de IList <T> ?

Lorsque j'écris mon DAL ou un autre code qui renvoie un ensemble d'éléments, devrais-je toujours faire ma déclaration de retour:

 public IEnumerable<FooBar> GetRecentItems()
 

ou

 public IList<FooBar> GetRecentItems()
 

Actuellement, dans mon code, j'ai essayé d'utiliser IEnumerable autant que possible, mais je ne suis pas sûr que ce soit la meilleure pratique? Cela semblait juste parce que je retournais le type de données le plus générique tout en décrivant ce qu'il fait, mais peut-être que ce n'est pas correct.

79voto

Sam Saffron Points 56236

Cadre de la conception de lignes directrices recommandent l'utilisation de la classe Collection lorsque vous avez besoin de retourner une collection qui est modifiable par l'appelant ou ReadOnlyCollection pour lire uniquement les collections.

La raison de ce qui est préférable à un simple IList est que IList ne pas informer l'appelant si sa lecture seule ou non.

Si vous retournez un IEnumerable<T> au lieu de cela, certaines opérations peuvent être un peu plus délicat pour l'appelant à effectuer. Aussi, vous ne pourront plus s'en donner à l'appelant la souplesse nécessaire pour modifier la collection, quelque chose que vous pouvez ou ne voulez pas.

Gardez à l'esprit que LINQ contient quelques tours dans sa manche et permettra d'optimiser certains appels en fonction du type qu'elles sont exécutées sur. Ainsi, par exemple, si vous effectuez un Comte et de la collection sous-jacente est une Liste il ne seront PAS marcher à travers tous les éléments.

Personnellement, pour un ORM je serais probablement le bâton avec Collection<T> que ma valeur de retour.

51voto

Jon Limjap Points 46429

Cela dépend vraiment pourquoi vous êtes à l'aide de cette interface spécifique.

Par exemple, IList<T> a plusieurs méthodes qui ne sont pas présents en IEnumerable<T>:

  • IndexOf(T item)
  • Insert(int index, T item)
  • RemoveAt(int index)

et les Propriétés:

  • T this[int index] { get; set; }

Si vous avez besoin de ces méthodes, alors, par tous les moyens de revenir IList<T>.

Aussi, si la méthode que consomme votre IEnumerable<T> résultat s'attend à une IList<T>, il va sauver la CLR de prendre en compte les conversions nécessaires, de façon à optimiser le code compilé.

51voto

Mel Points 1082

En général, vous devez utiliser le plus générique et renvoyer la chose la plus spécifique possible. Donc, si vous avez une méthode qui prend un paramètre et que vous avez vraiment besoin de ce qui est disponible dans IEnumerable, alors cela devrait être votre type de paramètre. Si votre méthode peut renvoyer un IList ou un IEnumerable, préférez renvoyer IList. Cela garantit qu'il est utilisable par le plus grand nombre de consommateurs.

Soyez lâche dans ce dont vous avez besoin et explicite dans ce que vous fournissez.

29voto

jerryjvl Points 9310

Ça dépend...

De retour le moins du type dérivé (IEnumerable) va vous laisser la plus grande marge de manoeuvre pour modifier l'implémentation sous-jacente bas de la piste.

Retour d'un plus type dérivé (IList) fournit aux utilisateurs de votre API avec plus d'opérations sur le résultat.

Je voudrais toujours vous suggérons de retourner le moins dérivé d'un type qui a toutes les opérations de vos utilisateurs vont avoir besoin... donc, fondamentalement, vous devez d'abord deremine ce que les opérations sur le résultat de sens que dans le contexte de l'API de définition.

10voto

Alex Martelli Points 330805

List<T> propose le code d'appel beaucoup plus de fonctionnalités, telles que la modification de l'objet retourné et l'accès par index. Donc, la question se résume à: dans votre application spécifique du cas d'utilisation, vous SOUHAITEZ vous appuyer sur de telles utilisations (probablement par le retour d'un fraîchement construit collection!), pour l'appelant de la commodité-ou voulez-vous la vitesse pour le cas simple lorsque tous les besoins de l'interlocuteur est à la boucle à travers la collecte et vous pouvez revenir en toute sécurité par une référence à un réel sous-jacent de la collection, sans craindre de cette obtiendrez elle donne à changé, etc?

Vous seul pouvez répondre à cette question, et c'est seulement en comprenant bien ce que vos visiteurs veulent faire avec le retour de la valeur et de l'importance de la performance est ici (quelle est la taille des collections, vous serait la copie, quelle est la probabilité que ce soit un goulot d'étranglement, etc).

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