Si j'ai le membre de classe suivant:
private List<object> obs;
9 Réponses :
Avez-vous envisagé de dériver une classe de System.Collections.ReadonlycollectionBase? P>
vous l'exposeriez sous forme d'un puisque vous avez indiqué que vous avez seulement voulu que vous vouliez que traverser Traversal < / em> de la liste, c'est tout ce dont vous avez besoin. p> On pourrait être tenté de renvoyer la liste Cependant, en utilisant Certains peuvent penser que cela qualifie comme une "expression dégénérée" selon la section 7.15.2.5 du C # Spécification de la langue. Cependant, Eric Lippert passe dans les détails sur la raison pour laquelle cette projection n'est pas optimisée . P> En outre, les gens suggèrent que l'on utilise le Méthode d'extension asénumable . Ceci est incorrect, car l'identité de référence de la liste d'origine est maintenue. À partir de la section Remarques de la documentation: P> En d'autres termes, tout ce qu'il fait est de lancer le paramètre Source à ienumerable
ienumerable
ienumerable
retour obs.elect (o => o); code> Vous finissez par retourner un itérateur sur la liste
Le
asenumerable
iEnumerable
ienumerable
IEnumerable
Notez que nous n'utiliserions jamais un appel explicite i> appeler pour sélectionner si cela est apparu dans votre code. Nous optimiserions l'appel implicite pour sélectionner lors de la transformation d'une expression de requête en appels de méthode. Si vous dites "de x en y où sélectionnez x" Il n'y a pas d'appel Select, juste un endroit où. Mais si vous dites "de x en y Select x", nous ne générons pas simplement "y", nous génèverons un appel de sélection sur celui-ci pour assurer une immuabilité du résultat.
Expose A Readonlycollection
Ce n'est pas vraiment un problème de rendre le contacteur à faire une petite chasse. Le premier résultat sur Google rend évident comment exposer un Readonlycollection
Je concéderai que ce que @Mitch Bheat aurait dû inclus un lien vers la page MSDN. De plus et nous serions simplement dupliquer le contenu de la page MSDN.
Vous pouvez le faire de deux manières:
soit en convertissant la liste en une collection lisonly: p>
this.obs.AsEnumerable()
ou en renvoyant un iEnumerable des éléments: p>
new System.Collections.ObjectModel.ReadOnlyCollection<object>(this.obs)
post et boîte de dialogue intéressants sur ce problème: http: / /davybrion.com/blog/2009/10/stop-Exposition-Collections-Already/ . P>
à votre interface Ajoutez la méthode suivante Signature: Public Inumérable Traversethelist ()
implimenté comme suit: p> qui vous permettra de procéder à ce qui suit: p> Le rendement de rendement indique au compilateur de construire un énumérateur pour vous. P> p>
Cela a déjà été dit, mais je ne vois aucune des réponses comme étant superclear.
Le moyen le plus simple consiste simplement de retourner une liste de readonlycollection p> L'inconvénient avec ceci est que si vous souhaitez modifier votre mise en œuvre plus tard, certains appelants peuvent déjà dépendre du fait que la collection fournit un accès aléatoire. Donc, une définition plus sûre serait de simplement exposer une note iEnumerable P> public IEnumerable<object> Objs {
get {
return objs.AsEnumerable();
}
}
Grande combinaison de simple + coffre-fort.
Il suffit de renvoyer un iReadonlycollection code>
.
private List<object> obs; IReadOnlyCollection<object> GetObjects() { return obs; }