TStringListとTList< string>
-
07-07-2019 - |
質問
標準を使用した場合の違いは何ですか
type
sl: TStringList
汎用TListの使用と比較
type
sl: TList<string>
?
私が見る限り、両者はまったく同じ動作をします。
同じことを行う別の方法ですか?
一方が他方より優れている状況はありますか?
ありがとう!
解決
- TStringListはTStringsの子孫です。
- TStringListは、アルファベット順にソートする方法を知っています。
- TStringListにはObjectsプロパティがあります。
- TStringListを使用しても、以前のすべてのバージョンのDelphiとコードの互換性が失われることはありません。
- TStringListは、公開されたプロパティとして使用できます。 (現時点では、一般的なクラスの公開を妨げるバグがあります。)
他のヒント
TStringListは、ジェネリックが登場する前からDelphiで長い間使用されてきました。したがって、文字列の一般的なリストにはない便利な機能をいくつか構築しました。
ジェネリックバージョンは、String型で機能するTListと同一の新しい型を作成するだけです。 (.Add()、. Insert()、. Remove()、. Clear()など)
TStringListには、基本的なTList型のメソッドと、.SaveToFile()や.LoadFromFile()などの文字列を操作するためのカスタムメソッドがあります
後方互換性が必要な場合は、TStringListを使用することをお勧めします。
文字列のリストを操作するための拡張機能が必要な場合は、TStringListが最適です。
あらゆるタイプのリストで作業する基本的なコーディングの基礎がある場合は、おそらくTStringListから目をそらす必要があります。
- TStringListはTStringsの子孫であるため、TMemoのLinesプロパティ、TListboxとTComboBoxのItems、およびその他のVCLコンポーネントと互換性があります。 使用できます cbList.Items:= StringList; //内部でTStrings.Assignを呼び出します
後方互換性が必要な場合はTStringListを使用し、前方互換性が必要な場合(おそらく、将来的にInt64のリストを使用するように文字列のリストを変更するオプション)を選択し、TListに移動します。
メモリの観点から、TStringListのメモリ使用量は、各アイテムに追加されるTObjectポインタのサイズとともに増加します。 TListのメモリ使用量は、各アイテムに追加されるポインターのサイズとともに増加します。検索、置換、ソート、連想操作なしで文字列の配列のみが必要な場合、動的配列(文字列の配列)で十分です。これにはTStringListまたはTListの適切なメモリ管理がありませんが、理論的には使用するメモリを少なくする必要があります。
TStringlistは、Delphiの非常に用途の広いクラスの1つです。 Objectsプロパティを何度も使用しました(そして悪用しました;-))。区切られた文字列をTMemoなどのコントロール(TListBox、TComboBox、ほんの一部をリストするため)にすばやく変換することは非常に興味深いです。
<ストライク> TStringListはポインターを処理する必要なく、私のニーズを満たしていたので、TListはあまり好きではありません(TlistはPointer値のリストであるため)。
編集:TList(ポインターのリスト)とTList(文字列の一般的なリスト)を混同しました。そのために残念。私の要点は次のとおりです。TStringListは単なる文字列のリストではありません。
TStringListが過去に悪用されたほとんどの目的では、TObjectDictionaryの方が優れています。より高速で、ソートの必要がありません。
TStringsオブジェクトが必要な場合(VCLはXE5でもジェネリックをあまり使用しないため、一般にUIの場合)TStringListを使用します。
TStringListは非常に長い間使用されており、多くの利点がありますが、すべてRob Kennedyが言及しています。
文字列とオブジェクトのペアとして使用することの唯一の本当の欠点は、オブジェクトをこのリストに期待され、保存されている実際の型にキャストする必要があることです(読み取り時)、そして私が知る限り、EmbarcaderoはDelphiを提供していませんでしたTStringListの汎用バージョンを使用した2009以降のVCLライブラリ。
この制限を克服するために、私はそのようなリストを内部で使用するために実装し、ほぼ3年間それが目的を果たすので、今日共有することにしました: https://github.com/t00/deltoo#tgenericstringlist
重要な注意点-ほとんどの場合、オブジェクトがリストに保存されている場合、デフォルトプロパティが文字列からオブジェクトに変更されます。これは、ほとんどアクセスされるプロパティでもあります。