Une partie de mon application (C # 3.0 .NET 3.5) nécessite que plusieurs listes de chaînes soient maintenues. Je les déclare, sans surprise, comme Les chaînes de ces ... et cela fonctionne aussi. Y a-t-il des inconvénients évidents à cela, techniquement ou philosophiquement? p> p> list
list code> s sont en réalité (et toujours). . Je me demande si cela pourrait être plus d'intention - révélateur d'être plus explicite, par exemple: p>
5 Réponses :
Personnellement, je le laisserais comme une liste La liste list
fondidide code> Classe qui envoie une chaîne puis stocke une liste
fondidés code>. p>.
En réalité, la classe code> String code> est scellée, ce qui découle de cela ne serait pas possible.
Je commencerais en allant dans l'autre direction: Enroulant la chaîne dans une classe / structure appelée fondidid. L'avantage de le faire, je pense, est supérieur à la liste générique par rapport à la liste spécialisée. P>
Quant à la FundidList, l'avantage de disposer d'une telle classe est similaire au point 3 ci-dessus pour le FUDIDID: vous avez un endroit où vous devez accroître les méthodes / fonctions qui fonctionnent sur la liste des Fundids (c'est-à-dire des fonctions agrégées). Sans un tel endroit, vous constaterez que les méthodes d'assistance statique commencent à se détacher tout au long du code ou, dans une classe d'assistance statique. P>
Certainement la voie à suivre. Spécialisez le type d'élément, car cette spécialisation des besoins (pour un fondidide code>), mais la liste (dans votre cas) est une liste et reste comme une liste. Il suffit de dériver de (et de spécialiser) si vous avez vraiment besoin d'une nouvelle fonctionnalité de la liste elle-même (qui ne peut pas être résolue par une autre classe de collecte ou LINQ).
Liste <> n'a pas de membres virtuels ou protégés - ces classes doivent presque jamais em> sous-classées. En outre, bien que cela soit possible, vous avez besoin de la fonctionnalité complète de Le sous-classement a une variété de descentes. Si vous déclarez que votre type local soit code> fondidlist code>, vous ne pourrez pas l'affecter par ex. Utilisation de Linq et Vous ne pouvez donc pas réellement ajouter de fonctionnalité que vous ne pouviez pas avec une méthode d'extension, et vos types ne sont plus compatibles qui limitent ce que vous pouvez faire avec votre liste. P>
Je préfère déclarer une structure enfin, voulez-vous vraiment dire Utilisez uniquement la liste Liste
.tolist Code> Étant donné que votre type est plus précis. J'ai vu des gens décider qu'ils ont besoin de fonctionnalités supplémentaires dans de telles listes, puis l'ajoutent à la classe de liste sous-classée. C'est problématique, car la mise en œuvre de la liste ignore de tels bits supplémentaires et peut violer vos contraintes - par exemple. Si vous exigez l'unicité et déclarez une nouvelle méthode d'ajout, quiconque qui est simplement (légalement) à
Liste
fondidide code> contenant une chaîne et implémenter toutes les garanties concernant cette chaîne dont vous avez besoin, puis travailler avec une liste
Liste <> code>? strong> Je vois beaucoup de gens utilisent
Liste <> code> pour les choses pour lesquelles
iEnumerable <> code> ou des tableaux simples sont plus appropriés. Exposer votre liste interne code> CODE> dans une API est particulièrement délicate car cela signifie que tout utilisateur d'API peut ajouter / supprimer / modifier des éléments. Même si vous copiez votre liste d'abord, une telle valeur de retour est toujours trompeuse, car les gens peuvent attendre em> pour pouvoir ajouter / supprimer / changer d'éléments. Et si vous êtes pas em> exposant la liste
code> dans une API, mais simplement l'utiliser pour la comptabilité interne, ce n'est pas aussi intéressant de déclarer et d'utiliser un type qui n'ajoute aucune fonctionnalité , seule la documentation. P>
Conclusion H2>
<> code> pour internals et ne le sous-classez pas si vous le faites. Si vous souhaitez une sécurité explicite, enveloppez
chaîne code> dans une structure (pas une classe, puisque une structure est plus efficace ici et a une meilleure sémantique: il n'y a pas de confusion entre un null
fondidé Code> et une chaîne NULL, ainsi que l'égalité d'objet et le scellage de hashcode comme prévu avec les structures mais doivent être spécifiés manuellement pour les classes). Enfin, exposez
iEnumerable <> code> si vous devez prendre en charge l'énumération ou si vous avez besoin d'indexation aussi bien, utilisez le simple
Readonlycollection <> code>
wrapper autour de votre liste plutôt que de laisser le client API avec des bits internes. Si vous vraiment em> besoin d'une API de liste mutatitable, Observablecollection <> code>
au moins vous permet de réagir aux modifications du client. P>
juste laissez-le comme une liste
public class FundIdList : List<string>
{
public void SpecialAction()
{
//can only do with a fund id list
//sorry I can't give an example :(
}
}
Quelle que soit la spécialité, cela pourrait être une méthode d'extension.
@Amon: Parfois, il ne veut pas que la méthode appelée par une liste
Que voulez-vous dire - appelé par?
sauf si je voulais que quelqu'un fasse tout ce qu'ils pouvaient à Et si je voulais que quelqu'un ait ce degré de contrôle, je leur donnerais probablement juste une liste En réalité, cela sonne (et fait souvent avec List
Fundidlist code> Je préférerais mettre en œuvre
Ilist
liste
Il est dangereux en C ++, mais parfaitement bien en C #.