Question

quelle est la différence d'utilisation d'un standard

type 
  sl: TStringList 

par rapport à l'utilisation d'un TList générique

type 
  sl: TList<string>

?

Pour autant que je sache, les deux se comportent exactement de la même manière.

Est-ce juste une autre façon de faire la même chose?

Existe-t-il des situations où l’un serait meilleur que l’autre?

Merci!

Était-ce utile?

La solution

  • TStringList est un descendant de TStrings.
  • TStringList sait comment se trier par ordre alphabétique.
  • TStringList a une propriété Objects.
  • TStringList ne rend pas votre code incompatible avec toutes les versions précédentes de Delphi.
  • TStringList peut être utilisé en tant que propriété publiée. (Un bogue empêche la publication des classes génériques pour le moment.)

Autres conseils

TStringList existe depuis longtemps dans Delphi avant les génériques. Par conséquent, il a construit une poignée de fonctionnalités utiles qu’une liste générique de chaînes ne comporterait pas.

La version générique ne fait que créer un nouveau type identique à TList qui fonctionne sur le type de chaîne. (.Add (), .Insert (), .Remove (), .Clear (), etc.)

TStringList a les méthodes de type TList de base et d’autres méthodes personnalisées pour travailler avec des chaînes, telles que .SaveToFile () et .LoadFromFile ()

Si vous voulez une compatibilité ascendante, alors TStringList est définitivement la voie à suivre.
Si vous souhaitez une fonctionnalité améliorée pour utiliser une liste de chaînes, TStringList est la solution. Si vous souhaitez utiliser certains principes de base du codage avec une liste de tout type, vous devez peut-être détourner les yeux de TStringList.

  • Comme TStringList est un descendant de TStrings, il est compatible avec la propriété Lines de TMemo, les éléments de TListbox et de TComboBox ainsi que d’autres composants VCL. Alors peut utiliser   cbList.Items: = StringList; // appelle en interne TStrings.Assign

Je dirais probablement que si vous voulez une compatibilité ascendante, utilisez TStringList, et si vous voulez une compatibilité ascendante (peut-être la possibilité de changer cette liste de chaînes pour dire la liste des Int64 à l'avenir), optez pour TList.

Du point de vue de la mémoire, l’utilisation de la mémoire de TStringList est augmentée de la taille du pointeur TObject ajouté à chaque élément. L'utilisation de la mémoire TList est augmentée avec la taille du pointeur ajouté à chaque élément. Si vous avez simplement besoin d’un tableau de chaînes sans effectuer de recherche, de remplacement, de tri ou d’association, un tableau dynamique (tableau de chaînes) devrait suffire. Cela manque d’une bonne gestion de la mémoire de TStringList ou de TList, mais devrait théoriquement utiliser moins de mémoire.

TStringlist est une classe très polyvalente de Delphi. J'ai utilisé (et abusé ;-)) sa propriété Objects à plusieurs reprises. Il est très intéressant de traduire rapidement une chaîne délimitée en un contrôle comme un TMemo et des contrôles similaires (TListBox, TComboBox, juste pour en énumérer quelques-uns).

Je n'aime tout simplement pas beaucoup TList, car TStringList a satisfait mes besoins sans avoir besoin de traiter les pointeurs (car Tlist est une liste de valeurs de pointeur).

EDIT: J'ai confondu le TList (liste de pointeurs) avec le TList (liste générique de chaînes). Désolé. Mon argument est valable: TStringList est bien plus qu'une simple liste de chaînes.

Dans la plupart des cas où TStringList a été utilisé de manière abusive dans le passé, TObjectDictionary est préférable: il est plus rapide et ne nécessite pas de tri.

Si vous avez besoin d'un objet TStrings (généralement pour les éléments d'interface utilisateur, car la VCL n'utilise pas beaucoup de génériques, même pour XE5), utilisez TStringList - le transtypage requis à partir de TObject est gênant, mais pas révélateur.

TStringList est utilisé depuis trop longtemps et présente de nombreux avantages, tous mentionnés par Rob Kennedy.

Le seul inconvénient réel de l’utiliser comme une paire de chaînes et d’objets est la nécessité de fondre l’objet sur le type réel attendu et stocké dans cette liste (lors de la lecture) et, autant que je sache, Embarcadero n’a pas fourni Delphi. Bibliothèques VCL 2009 et supérieures avec version générique de TStringList.

Pour surmonter cette limitation, j’ai mis en place une telle liste pour un usage interne et, pendant presque trois ans, elle a servi à sa réalisation. J’ai donc décidé de la partager aujourd’hui: https://github.com/t00/deltoo#tgenericstringlist

Une remarque importante - elle modifie la propriété par défaut de Strings en Objets, car dans la plupart des cas, lorsque l'objet est stocké dans une liste, il s'agit également de la propriété la plus consultée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top