48 votes

List, IList, IEnumerable, IQueryable, ICollection, quel est le type de retour le plus flexible ?

J'ai déjà vu cette question posée ici, mais je ne suis pas certain d'en comprendre toutes les ramifications. Le problème est de savoir quel type de retour doit avoir une couche de données qui utilise linq-to-sql pour un maximum de flexibilité et de capacité d'interrogation. Voici ce que j'ai lu/trouvé :

  1. IEnumerable est limité et ne permet que des opérations de lecture directe. IEnumerable est le plus générique. Ce que j'ai découvert, c'est que IEnumerable permet des opérations d'interrogation par rapport à la syntaxe d'extension.

  2. La liste offre la plus grande flexibilité grâce aux opérations d'insertion.

  3. Les collections doivent être utilisées à la place des listes pour permettre des collections en lecture seule.

  4. IQueryable ne doit jamais être utilisé, il doit être "utilisé et désactivé". IQueryable ne renvoie pas de liste mais génère une syntaxe de requête pour la base de données.

J'ai l'impression d'avoir une meilleure perception des compromis, mais je ne suis pas encore sûr de certaines choses :

  1. Pourquoi choisirais-je les variantes d'interface plutôt que les types concrets ? Par exemple, IList ou ICollection par rapport à List ou Collection. Quel avantage en tirerais-je ?

  2. Je vois que les opérations d'extension fonctionnent, mais la syntaxe de requête étendue fonctionnera-t-elle également ?

  3. Quelqu'un m'a déjà suggéré d'utiliser AsQueryable(). Mais pourquoi ferais-je cela si je n'ai pas de connexion à la base de données ? Il semble que les méthodes d'extension fonctionnent de toute façon.

30voto

Varun Gupta Points 767

IEnumerable<> \=> Permet l'utilisation de 'foreach' sur une collection

ICollection<> \=> As IEnumerable<> + Add(), Remove(), Count, Clear(), Contains(), IsReadOnly, CopyTo()

IList<> \=> As ICollection<> + this[int], Insert(), IndexOf(), RemoveAt(). ie. Il ajoute le type d'indexation opérateurs de liste

-Il est possible d'utiliser "return yield ? ??" en conjonction avec IEnumerable<> pour ne renvoyer qu'un seul objet à la fois. C'est de là que vient la véritable puissance de IEnumerable (et non du simple retour d'une liste ou d'un tableau).

-Lors du renvoi d'une liste, il convient de déterminer ce qui peut être exposé à l'utilisateur et de renvoyer le type approprié.

Il est peut-être préférable de renvoyer une ICollection<> ou une IList<> et si le client n'a besoin que d'énumérer la liste, il peut la convertir en IEnumerable<>. Par exemple, étant donné ICollection SomeMethod() L'utilisateur peut l'invoquer en tant que IEnumerable widgets = SomeMethod().

29voto

Rex M Points 80372

Les collections ne sont généralement pas très utiles pour les retours DAL, car une collection ne garantit pas implicitement l'ordre. Il s'agit simplement d'un ensemble d'éléments. Une IList, en revanche, garantit implicitement l'ordre. Il ne nous reste donc plus qu'à choisir entre IEnumerable et IList. La question suivante est de savoir si l'objet List est "vivant", c'est-à-dire s'il est connecté à la base de données, de sorte que lorsque vous ajoutez un élément à la liste IList, cela se répercute dans la base de données. Pour LINQ-to-SQL, ce n'est pas le cas. Vous êtes plutôt censé attacher des entités aux tables. Donc, à moins que vous ne fournissiez ce câblage supplémentaire, une liste est superflue. Il faut s'en tenir à IEnumerable.

7voto

Trevor Pilley Points 7304

Vous devez toujours renvoyer une interface plutôt qu'un type concret, ce qui va de soi puisqu'elle spécifie le comportement autorisé sans lier le consommateur à une implémentation spécifique.

En ce qui concerne le choix de l'interface à renvoyer, il convient de réfléchir à l'objectif de la méthode et aux intentions de l'appelant. Si vous renvoyez une collection, l'appelant doit-il pouvoir modifier la collection, par exemple ajouter/supprimer des éléments ? Si tout ce qu'il a besoin de faire est de l'énumérer (faire un foreach), alors vous devriez simplement renvoyer une IEnumerable.

3voto

Kevin Shea Points 112

1) Il est préférable de renvoyer une liste IL afin que les résultats puissent être placés dans n'importe quel objet implémentant cette interface, plutôt que de forcer l'appelant à utiliser une liste. Par exemple, l'appelant peut souhaiter que les résultats soient renvoyés dans un ArrayList, ce qui ne serait pas possible si les résultats étaient renvoyés dans une List. ArrayList n'hérite pas de List, mais implémente IList.

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