11
votes

VB6 équivalent à la liste

Je veux savoir s'il existe un équivalent de (.NET) xxx

dans vb6

Je sais que l'existence de la collection dans VB6 mais il utilise un objet (variante) au lieu d'un objet spécifique.

merci.


0 commentaires

5 Réponses :


2
votes

VB6 est une langue ancienne. Il ne contient pas de types de modèle comme il y a dans les langues modernes (C ++, C #, Java). Donc, vous devrez stocker vos objets comme des variantes de la collection, puis les jeter à votre type d'objet plus tard.


4 commentaires

Je travaille habituellement avec C # dans divers projets, mais pour des exécutables autonomes. Pourquoi?. Parce que .NET est lent (dans la plupart des cas), il peut être facilement décompilé, il a nécessité le cadre net, il ne fonctionne pas avec la plupart des systèmes d'exploitation, VB6 peut fonctionner de Windows95 à Linux (avec du vin sans trop d'effort). Et Java pour le stand seul exécutable est "funky" au mieux. Mon autre option est Delphi et C ++ mais c'est une autre histoire.


Votre raisonnement est faux. VB6 manque de types génériques non parce que c'est une langue ancienne (ce qu'elle n'est pas, C ++ est beaucoup plus âgée), mais parce que c'était une décision consciente de garder ce genre de complexité de la langue qui a une niche complètement différente.


Notez que je n'ai pas bownvote, car -2 est plus que suffisamment bas pour un poste qui fournit en effet la bonne réponse. Mais je pense que cela convient de souligner que nous, en tant que programmeurs, ne toujours avez le luxe de choisir la langue que nous voulons. Votre suggestion n'est pas vraiment utile et probablement plus frustrante que tout. Et pour ce que ça vaut la peine, vous vous souviendrez peut-être de la vie avant les génériques de cette "antique" C # 1.1 ...


Ce commentaire était principalement destiné à exprimer ma forte aversion de la langue / la syntaxe de base elle-même. Mais je suppose que cela aurait mieux correspondre dans un commentaire que dans une réponse.



2
votes

EDIT: Si la solution de Cody Gray est trop surdimensionnée pour vos besoins, vous pouvez essayer la solution "Liste des pauvres", comme suit: xxx

bien sûr, une liste (in c #) ou une liste (de ciixedclass) dans vb.net est beaucoup plus "convivial" car il a des méthodes telles que trouver, supprimer, addrange et d'autres choses utiles. L'ancienne construction VB6 traite très mal avec le cas "Liste vide". Ne pas oublier, la liste <..> L'augmentation a beaucoup de meilleures performances pour les grandes listes (taille> 1000).


2 commentaires

Il s'agit d'une solution plausible, sauf que les performances de Redim conserve peuvent être tueuses si vous vous trouvez en appelant beaucoup. Utilisation de tableaux ou d'une collection dans VB 6 est une décision de conception importante et le meilleur conseil est que si vous savez (ou peut être étroitement approximatif), le nombre d'articles que vous aurez à l'avance, vous devriez devoir optez pour un tableau. La performance est légèrement meilleure qu'une collection , mais si vous allez ajouter et supprimer de manière dynamique des objets, une collection est probablement le meilleur choix.


@Cody Grey: Oui en effet, la performance peut devenir mauvaise de cette façon. Dans les programmes les plus réels au monde, j'ai écrit les 5 dernières années à Excel-VBA, le cas de la liste 98% d'une liste est une liste avec moins de 500 entrées, où cette solution si suffisante.



23
votes

Il n'y a pas d'équivalent en VB 6 au générique Liste code> trouvé dans VB.NET. Cependant, il y a une telle chose comme Collection code> VB 6, qui fournit des fonctionnalités similaires. La principale différence est que VB 6 Collection code> est pas fortement typé em>, ce qui signifie que tous les objets sont stockés comme Variantes code> dans la collection. Dans certains cas, cela peut être bénéfique, car il vous permet de stocker différents types de données dans la même collection, et en fait, VB utilise cet objet en interne. Il est assez facile d'utiliser un Collection code> et objets haut coulés comme ils sont récupérés de la classe, mais il y a peu, vous pouvez le faire. Il est impossible de mettre en œuvre des collections fortement typées dans l'exécution VB.

Cela étant dit, il existe une solution que vous pouvez mettre en œuvre. De même à la façon dont les collections ont été mises en œuvre dans les premières versions de VB.NET avant génériques ont été introduits, vous pouvez envelopper le Collection code> dans une classe, où le seul accès à l'interne Collection code> est par des méthodes que vous exposiez de cette classe strong>. Ce modèle de conception est communément appelée p>

« collection personnalisée » strong>. Cela a l'avantage de la coulée de manutention automatique, et pallie les consommateurs de votre code d'avoir à se rappeler de l'esprit les détails de mise en œuvre comme celle-ci. Il prend en charge la (trop probable) possibilité que vous serez Boucler dans une collection à l'exécution qui est censé ne contenir qu'un seul type d'objet, mais avait accidentellement une seconde, le type d'objet incompatible a ajouté que provoque votre code de lancer une exception. Bien sûr, l'inconvénient est que vous devez réimplémenter la plupart des fonctionnalités déjà fournies par le Collection code> vous-même, sous la forme de méthodes publiques sur votre collection personnalisée. P>

Voici un exemple de la façon dont vous pouvez aller à ce sujet: p>

Public Property Get NewEnum() As IUnknown
    ''#Provides support for enumeration using For Each
    Set NewEnum = m_Customers.[_NewEnum]
End Property


4 commentaires

+1. IMHO Cette solution (correcte) est utile dans beaucoup de cas, mais pour d'autres cas, il peut être un peu trop surdimensionné.


@Doc Brown: convenu. Excellent choix de mots.


+1 mais ne créez pas vous-même la chaudière vous-même. Francesco Balena a écrit CollectionClassmaster , un plug-in gratuit pour l'IDE VB6 qui le fera pour vous automatiquement. Ceci est maintenant gentiment hébergé par angryhacker )


CollectionClassmaster est maintenant hébergé sur Devx



5
votes

Voici notre mise en œuvre de l'arraylist. Vous pouvez l'utiliser comme une base (pas par héritage évidemment, mais par la composition, comme indiqué dans la réponse de Codygray) pour une classe fortement dactylographiée, mais si vous n'avez pas besoin de sécurité, il est bien meilleur que la classe de collecte. xxx


2 commentaires

+1 solution intéressante. Juste hors de curiosité: avez-vous préparé cela comme étant plus rapide pour les ajouts / insertions que la catégorie ? Ou de quelle manière avez-vous voulu dire que c'était mieux?


De quelle manière est-ce mieux? La collection peut accidentellement devenir un dictionnaire, sans votre connaissance. Ensuite, votre compte est, dites 5, mais les éléments sont (0,1,4,5,6), vous obtenez une erreur lorsque vous essayez d'accéder à l'élément 3 et d'obtenir une erreur. En outre, il est plus rapide si vous définissez GRÔLEZIZE pour être approprié pour la taille de votre matrice (oui, cela pourrait probablement s'améliorer en doublant à chaque fois que cela augmente, mais c'est une micro-optimisation qui ne vaut pas le code supplémentaire). Cependant, ces jours-ci (quand il a été écrit, la vitesse d'un processeur était d'environ 200 MHz) l'efficacité n'est pas ce qui est important, ce n'est pas un bogue.



0
votes

Dictionnaire est le meilleur moyen de contenir n'importe quel objet.


0 commentaires