Collection personnalisée à l'aide de IEnumerable vs ICollection vs IList
J'ai besoin de concevoir mon propre GenericCollection
classe. Maintenant, j'ai beaucoup d'options à le calculer à l'aide de IEnumerable
, ICollection
, et IList
, où, plus tard propose quelques fonctions supplémentaires.
Je suis un peu confus que si je pars avec IEnumerable<T>
je peut exiger la déclaration de l'objet à fait tenir la collection comme dans ce cas _list
.
public class GenericCollection<T> : IEnumerable<T>
{
private List<T> _list;
//...
}
Mais si j'y vais avec ICollection<T>
ou IList<T>
, je n'ai pas besoin de déclarer la List
objet tel qu'il est implicitement disponibles.
public class GenericCollection<T> : IList<T>
{
//no need for List object
//private List<T> _list;
//...
}
Quelle est la différence entre ces deux approches à l'égard de performance?
Dans le scénario de chacun est préféré en particulier quand il s'agit de la conception de votre propre collection. Je suis intéressé par le poids léger de la collection avec de bonnes performances. Je pense que cela peut être réalisé en utilisant des IEnumerable<T>
mais comment exactement, avec quelques bonnes raisons pour aller avec elle?
J'ai examiné certains postes existants, mais aucun n'est de donner les renseignements nécessaires.
De retour 'IList' vs 'ICollection' vs 'Collection'
- vous n'êtes pas obligé d'avoir _list membre dans le premier exemple. En outre, vous avez encore de mettre en œuvre certains mécanismes de stockage en cas de inhering de IList et de mise en œuvre de l'interface à l'égard de IList
- Collection générique? sonne comme une Liste à moi...
- Vous pouvez modifier l'implémentation sous-jacente, de Collection Générique est juste un wrapper.
Vous devez vous connecter pour publier un commentaire.
IEnumerable
,ICollection
, etIList
(généralement, tout type avec unI
préfixe) sont juste interfaces. Ils vous permettent d'exposer ce que votre classe va le faire, mais à la différence si vous hériter une classe, les interfaces ne pas vous fournir une implémentation par défaut de toutes les choses qu'ils disent que vous devez faire.Autant que le choix de l'interface, voici un guide rapide:
IList
est unICollection
qui peuvent être accessibles par un index.ICollection
est unIEnumerable
avec un accès facile à des choses commeAdd
,Remove
, etCount
.IEnumerable
est quelque chose qui peut être énumérés, même si la liste de ces choses n'existe pas jusqu'à ce que vous énumérez il.Certaines classes que vous pourrez étendre (ou à garder comme un champ privé qui exécute la plupart de la logique) pour votre collection sont
List<T>
,Collection<T>
, (qui implémenteIList<T>
, mais avec un accès plus facile à la redéfinition de la mise en œuvre, voir Collection<T> rapport de la Liste<T>, que devriez-vous utiliser sur vos interfaces? pour les grandes différences entre ces deux)ObservableCollection<T>
, ou des collections qui ne sont pas listes, commeDictionary<T, U>
etHashSet<T>
. Pour plus d'informations sur l'un de ces, consultez la documentation MSDN sur la classe.Tout d'abord, vous n'avez pas à choisir entre ces interfaces, si c'est nécessaire, vous pouvez mettre en œuvre tous les trois. Deuxièmement, la mise en œuvre de IEnumerable ne vous obligent pas à faire la liste sous-jacente public. Vous pouvez mettre en œuvre les modes d'utilisation de l'agent Recenseur de la liste sous-jacente.
Performancewise, je doute qu'il y aura beaucoup d'impact, se concentrer sur ce que vous avez besoin fonctionnellement. La seule façon de le savoir est de mesurer.
La performance est peu probable d'être dépendant sur quelles interfaces sont mises en œuvre. En fait cela dépend de combien d'instructions que le processeur doit exécuter pour atteindre un certain but. Si vous mettez en œuvre IEnumerable et l'enrouler sur la Liste, vous êtes susceptibles de finir par l'écriture d'Ajouter/Supprimer/ce[] les méthodes qui sont juste multiplication des appels à la Liste, ce qui permettrait d'ajouter une surcharge de performance. Par conséquent, bien que je n'ai pas pris toutes les mesures, l'héritage approche serait probablement un petit peu plus rapide.
Cependant, ces détails habituellement seulement pour les applications en temps réel avec un extrême besoin d'économiser chaque cycle du PROCESSEUR. Eric Lippert a un excellent article à propos de prêter attention à de tels détails: http://blogs.msdn.com/b/ericlippert/archive/2003/10/17/53237.aspx. Généralement, vous êtes probablement mieux d'utiliser l'approche qui correspond le mieux la logique métier et l'architecture de votre application, plutôt que sur la performance de détails.