delphi generics tstringlist

delphi - TStringList vs. TList<cadena>



delphi 7 tstringlist (8)

Desde el punto de vista de la memoria, el uso de la memoria TStringList aumenta con el tamaño del puntero TObject añadido a cada elemento. El uso de la memoria TList aumenta con el tamaño del puntero añadido a cada elemento. Si solo se necesita una matriz de cadenas sin buscar, reemplazar, clasificar ni realizar operaciones asociativas, una matriz dinámica (matriz de cadenas) debería ser suficiente. Esto carece de una buena gestión de memoria de TStringList o TList, pero en teoría debería usar menos memoria.

¿Cuál es la diferencia al usar un estándar?

type sl: TStringList

en comparación con el uso de un TList genérico

type sl: TList<string>

?

Por lo que puedo ver, ambos se comportan exactamente igual.

¿Es solo otra forma de hacer lo mismo?

¿Hay situaciones en las que una sería mejor que la otra?

¡Gracias!


La lista de TString es una clase muy versátil de Delphi. Usé (y abusé ;-)) su propiedad Objects muchas veces. Es muy interesante traducir rápidamente una cadena delimitada a un control como un TMemo y otros similares (TListBox, TComboBox, solo para enumerar algunos).

Simplemente no me gusta mucho TList, ya que TStringList satisfizo mis necesidades sin necesidad de tratar los punteros (ya que Tlist es una lista de valores de puntero).

EDITAR: confundí TList (lista de punteros) con TList (lista genérica de cadenas). Lo siento por eso. Mi punto es: TStringList es mucho más que una simple lista de cadenas.


Para la mayoría de los propósitos que TStringList ha sido abusado en el pasado, TObjectDictionary es mejor, es más rápido y no necesita clasificación.

Si necesita un objeto TStrings (generalmente para cosas de UI, dado que el VCL no usa mucho los genéricos incluso para XE5) use TStringList - el lanzamiento requerido de TObject es molesto pero no desagradable.


Probablemente diría que si quieres compatibilidad con versiones anteriores usa TStringList, y si quieres compatibilidad con versiones anteriores (tal vez la opción de cambiar esa lista de cadenas para decir la lista de Int64s en el futuro) entonces ve a TList.


TStringList ha existido durante mucho tiempo en Delphi antes de que existieran los genéricos. Por lo tanto, ha acumulado un puñado de características útiles que una lista genérica de cadenas no tendría.

La versión genérica solo está creando un nuevo tipo que es idéntico a TList que funciona en el tipo de Cadena. (.Add (), .Insert (), .Remove (), .Clear (), etc.)

TStringList tiene los métodos básicos de tipo TList y otros métodos personalizados para trabajar con cadenas, como .SaveToFile () y .LoadFromFile ()

Si quieres compatibilidad con versiones anteriores, entonces TStringList es definitivamente el camino a seguir.
Si desea una funcionalidad mejorada para trabajar con una lista de cadenas, entonces TStringList es el camino a seguir. Si tiene algunos fundamentos básicos de codificación que desea que funcionen con una lista de cualquier tipo, quizás deba desviar la mirada de TStringList.


TStringList se ha utilizado durante demasiado tiempo y tiene muchas ventajas, todas mencionadas por Rob Kennedy.

La única desventaja real de usarlo como un par de cuerdas y un objeto es la necesidad de lanzar el objeto al tipo real esperado y almacenado en esta lista (cuando se lee) y hasta donde yo sé, Embarcadero no proporcionó Delphi 2009 y posteriores. Bibliotecas VCL con versión genérica de TStringList.

Para superar esta limitación implementé dicha lista para uso interno y durante casi 3 años cumple su función, así que decidí compartirla hoy: https://github.com/t00/deltoo#tgenericstringlist

Una nota importante: cambia la propiedad predeterminada de Cadenas a Objetos, ya que en la mayoría de los casos, cuando el objeto se almacena en una lista, también es la propiedad a la que más se accede.


  • Como TStringList es un descendiente de TStrings, es compatible con la propiedad Líneas de TMemo, Elementos de TListbox y TComboBox y otros componentes de VCL. Entonces puede usar cbList.Items: = StringList; // internamente llama a TStrings.Assign

  • TStringList es un descendiente de TStrings.
  • TStringList sabe cómo clasificarse alfabéticamente.
  • TStringList tiene una propiedad de Objetos.
  • TStringList no hace que su código sea incompatible con todas las versiones anteriores de Delphi.
  • TStringList se puede utilizar como una propiedad publicada. (Un error impide que las clases genéricas se publiquen, por ahora).