Подтвердить что ты не робот

TStringList против TList <string>

В чем разница в использовании стандартного

type 
  sl: TStringList 

по сравнению с использованием общего TList

type 
  sl: TList<string>

?

Насколько я вижу, оба ведут себя точно так же.

Это просто другой способ сделать то же самое?

Есть ли ситуации, когда лучше быть лучше других?

Спасибо!

4b9b3361

Ответ 1

  • TStringList является потомком TStrings.
  • TStringList знает, как сортировать себя по алфавиту.
  • TStringList имеет свойство Objects.
  • TStringList не делает ваш код несовместимым со всеми предыдущими версиями Delphi.
  • TStringList может использоваться как опубликованное свойство. (Ошибка запрещает публикацию родовых классов на данный момент.)

Ответ 2

TStringList уже долгое время находится в Delphi до того, как появились дженерики. Поэтому он создал несколько полезных функций, которые не имели бы общий список строк.

Версия generics просто создает новый тип, идентичный TList, который работает с типом String. (.Add(),.Insert(),.Remove(),.Clear() и т.д.)

TStringList имеет основные методы типа TList и другие методы, настраиваемые для работы со строками, такие как .SaveToFile() и .LoadFromFile()

Если вам нужна обратная совместимость, то TStringList - это определенно путь.
Если вам нужна расширенная функциональность для работы со списком строк, то TStringList - это путь. Если у вас есть базовые основы кодирования, которые вы хотите использовать со списком любого типа, то, возможно, вам нужно отвести взгляд от TStringList.

Ответ 3

  • Поскольку TStringList является потомком TStrings, он совместим со свойством Lines TMemo, элементами TListbox и TComboBox и другими компонентами VCL. Так можно использовать cbList.Items: = StringList;//внутренне вызывает TStrings.Assign

Ответ 4

Я бы сказал, если вы хотите, чтобы обратная совместимость использовала TStringList, и если вам нужна передовая совместимость (возможно, возможность изменить этот список строк, чтобы сказать список Int64s в будущем), перейдите к TList.

Ответ 5

TStringlist - один очень универсальный класс Delphi. Я использовал (и злоупотреблял;-)) свойством объектов много раз. Очень интересно быстро перевести строку с разделителями на элемент управления, такой как TMemo и аналогичные (TListBox, TComboBox, просто чтобы перечислить несколько).

Мне просто не нравится много TList, поскольку TStringList удовлетворяет мои потребности, не требуя обработки указателей (поскольку Tlist - это список значений указателя).

EDIT: я путаю TList (список указателей) с TList (общий список строк). Простите за это. Моя точка зрения: TStringList - это намного больше, чем простой список строк.

Ответ 6

С точки зрения памяти Использование памяти TStringList увеличивается с добавлением указателя TObject к каждому элементу. Использование памяти TList увеличивается с размером указателя, добавленного к каждому элементу. Если нужен только массив строк без поиска, замены, сортировки или ассоциативных операций, динамический массив (массив строки) должен быть достаточно. Это отсутствие хорошего управления памятью TStringList или TList, но теоретически следует использовать меньше памяти.

Ответ 7

В большинстве случаев, когда TStringList в прошлом злоупотребляли, TObjectDictionary лучше - он быстрее и не нуждается в сортировке.

Если вам нужен объект TStrings (как правило, для содержимого пользовательского интерфейса, поскольку VCL не использует дженерики даже для XE5), используйте TStringList - требуемое литье из TObject раздражает, но не showstopper.

Ответ 8

TStringList используется слишком долго и имеет много преимуществ, упомянутых Робом Кеннеди.

Единственный реальный недостаток использования его в качестве пары строки и объекта - необходимость бросать объект в реальный тип, ожидаемый и сохраняемый в этом списке (при чтении), и насколько я знаю, Embarcadero не предоставил Delphi 2009 и выше библиотеки VCL с общей версией TStringList.

Чтобы преодолеть это ограничение, я внедрил такой список для внутреннего использования, и почти 3 года он служит ему, поэтому я решил поделиться им сегодня: https://github.com/t00/deltoo#tgenericstringlist

Одна важная нота - она ​​изменяет свойство по умолчанию от Strings to Objects, так как в большинстве случаев, когда объект хранится в списке, он также является главным образом доступным свойством.