Domanda

qual è la differenza nell'uso di uno standard

type 
  sl: TStringList 

rispetto all'utilizzo di un TList generico

type 
  sl: TList<string>

Per quanto posso vedere, entrambi si comportano esattamente allo stesso modo.

È solo un altro modo di fare la stessa cosa?

Ci sono situazioni in cui una sarebbe migliore dell'altra?

Grazie!

È stato utile?

Soluzione

  • TStringList è un discendente di TStrings.
  • TStringList sa come ordinare in ordine alfabetico.
  • TStringList ha una proprietà Objects.
  • TStringList non rende il codice incompatibile con tutte le versioni precedenti di Delphi.
  • TStringList può essere utilizzato come proprietà pubblicata. (Un bug impedisce per ora la pubblicazione di classi generiche.)

Altri suggerimenti

TStringList è in circolazione da molto tempo a Delfi prima che esistessero i generici. Pertanto, ha creato una manciata di funzioni utili che un elenco generico di stringhe non avrebbe.

La versione generics sta semplicemente creando un nuovo tipo identico a TList che funziona sul tipo di String. (.Add (), .Insert (), .Remove (), .Clear (), ecc.)

TStringList ha i metodi di tipo TList di base e altri metodi personalizzati per lavorare con le stringhe, come .SaveToFile () e .LoadFromFile ()

Se si desidera la compatibilità con le versioni precedenti, TStringList è sicuramente la strada da percorrere.
Se si desidera funzionalità avanzate per lavorare con un elenco di stringhe, TStringList è la strada da percorrere. Se disponi di alcune nozioni di base sulla codifica che desideri utilizzare con un elenco di qualsiasi tipo, forse devi distogliere lo sguardo da TStringList.

  • Poiché TStringList è un discendente di TStrings, è compatibile con la proprietà Lines di TMemo, Items of TListbox e TComboBox e altri componenti VCL. Quindi può usare   cbList.Items: = StringList; // chiama internamente TStrings.Assign

Probabilmente direi che se vuoi la compatibilità all'indietro usa TStringList, e se vuoi la compatibilità in avanti (forse l'opzione per cambiare quell'elenco di stringhe per dire un elenco di Int64 in futuro), scegli TList.

Dal punto di vista della memoria, l'utilizzo della memoria di TStringList viene aumentato con la dimensione del puntatore TObject aggiunta a ciascun elemento. L'utilizzo della memoria TList viene aumentato con la dimensione del puntatore aggiunta a ciascun elemento. Se è necessario solo un array di stringhe senza ricerca, sostituzione, ordinamento o operazioni associative, un array dinamico (array di stringhe) dovrebbe essere sufficiente. Questo non ha una buona gestione della memoria di TStringList o TList, ma in teoria dovrebbe usare meno memoria.

TStringlist è una classe molto versatile di Delphi. Ho usato (e abusato ;-)) la sua proprietà Oggetti molte volte. È molto interessante tradurre rapidamente una stringa delimitata in un controllo come un TMemo e simili (TListBox, TComboBox, solo per elencarne alcuni).

Semplicemente non mi piace molto TList, poiché TStringList ha soddisfatto le mie esigenze senza la necessità di trattare i puntatori (poiché Tlist è un elenco di valori di puntatore).

EDIT: ho confuso TList (elenco di puntatori) con TList (elenco generico di stringhe). Scusa per quella cosa. Il mio punto è: TStringList è molto più di un semplice elenco di stringhe.

Per la maggior parte dei casi in cui TStringList è stato abusato in passato, TObjectDictionary è migliore: è più veloce e non necessita di ordinamento.

Se hai bisogno di un oggetto TStrings (generalmente per roba dell'interfaccia utente, dal momento che il VCL non usa molto i generici anche per XE5) usa TStringList - il casting richiesto da TObject è fastidioso ma non uno showtopper.

TStringList è stato usato per troppo tempo e presenta molti vantaggi, tutti citati da Rob Kennedy.

L'unico vero svantaggio di usarlo come una coppia di una stringa e un oggetto è la necessità di lanciare l'oggetto sul tipo effettivo previsto e memorizzato in questo elenco (durante la lettura) e per quanto ne so Embarcadero non ha fornito Delphi 2009 e fino librerie VCL con versione generica di TStringList.

Per superare questa limitazione ho implementato tale elenco per uso interno e per quasi 3 anni serve allo scopo, quindi ho deciso di condividerlo oggi: https://github.com/t00/deltoo#tgenericstringlist

Una nota importante: cambia la proprietà predefinita da Stringhe a Oggetti poiché nella maggior parte dei casi quando l'oggetto è memorizzato in un elenco è anche la proprietà per lo più accessibile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top