Pregunta

cuál es la diferencia en el uso de un estándar

type 
  sl: TStringList 

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

type 
  sl: TList<string>

?

Hasta donde 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!

¿Fue útil?

Solución

  • TStringList es un descendiente de TStrings.
  • TStringList sabe cómo ordenarse 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 usar como una propiedad publicada. (Un error impide que las clases genéricas se publiquen, por ahora).

Otros consejos

TStringList ha existido durante mucho tiempo en Delphi antes de que existieran los genéricos. Por lo tanto, ha creado 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 desea compatibilidad con versiones anteriores, entonces TStringList es definitivamente el camino a seguir.
Si desea una funcionalidad mejorada para trabajar con una lista de cadenas, TStringList es el camino a seguir. Si tiene algunos fundamentos básicos de codificación con los que desea trabajar con una lista de cualquier tipo, tal vez necesite apartar la vista de TStringList.

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

Probablemente diría que si desea compatibilidad con versiones anteriores, use TStringList, y si desea compatibilidad con versiones anteriores (tal vez la opción de cambiar esa lista de cadenas para decir la lista de Int64 en el futuro), vaya a TList.

Desde el punto de vista de la memoria, el uso de la memoria TStringList aumenta con el tamaño del puntero TObject agregado a cada elemento. El uso de la memoria TList aumenta con el tamaño del puntero agregado a cada elemento. Si solo se necesita una matriz de cadenas sin buscar, reemplazar, ordenar u 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.

La TStringlist es una clase muy versátil de Delphi. Usé (y abusé ;-)) su propiedad de Objetos 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 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 que TStringList es mucho más que una simple lista de cadenas.

Para la mayoría de los propósitos por los que se ha abusado de TStringList en el pasado, TObjectDictionary es mejor: es más rápido y no necesita ser ordenado.

Si necesita un objeto TStrings (generalmente para cosas de la interfaz de usuario, ya que el VCL no usa genéricos incluso para XE5) use TStringList: la conversión requerida desde TObject es molesta pero no un showtopper.

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 una cadena y un objeto es la necesidad de convertir el objeto al tipo real esperado y almacenado en esta lista (al leer) y, por lo que sé, Embarcadero no proporcionó a Delphi Bibliotecas VCL 2009 y posteriores 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 propósito, 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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top