3

私のSpring4Dフォークにmap()、reduce()、およびwhere(qlint:string)を追加しました。これらの関数をプログラミングしているときに、リストが異なる方法で作成されると、リストの動作に違いがあることがわかりました。

TList<TSomeClass>.create列挙型のオブジェクトを使用してそれらを作成すると、タイプはTSomeClass.

TCollections.CreateList<TSomeClass>列挙型のオブジェクトを使用してそれらを作成すると、タイプはTObject.

質問は次のとおりです。

を使用することでマイナス面はありTList<TSomeClass>.createますか?
言い換えれば、なぜ使用する必要があるのTCollections.CreateList<TSomeClass>ですか?


ところで:TCollections.CreateListを使用すると、TListではなくTObjectListを取得しました。したがって、TCollections.CreateObjectList... という名前にする必要がありますが、それは別の話です。

4

1 に答える 1

12

コンパイラのバージョンに応じて、Spring.Collections.TCollections.Createメソッドの多くは、コンパイラができないことを適用しています。つまり、実装を非常にスリムな汎用クラスに折りたたんでいます。一部のメソッドは XE 以降でそれを実行しており、一部は XE7 以降でのみ実行されています (GetTypeKind組み込み関数を使用すると、コンパイル時に型解決を実行できますTCollections.CreateList<T>。たとえば、パラメーターなしを参照してください)。

IList<T>多くの異なるタイプ(T はクラスまたはインターフェイス)を作成する場合、これによりバイナリ サイズが大幅に削減されTFolded(Object|Interface)List<T>ます。ただし、インターフェイスを介して、指定したとおりにアイテムにアクセスしており、プロパティはorElementTypeだけでなく正しいタイプを返します。ベルリンでは、さまざまなオブジェクト リストごとに 1K 未満しか追加されませんが、.TObjectIInterfaceIList<T>

T が完全に設計どおりのクラスである場合に、 a によってサポートされるanをTCollections.CreateList<T>返すことについて。が渡されたため、 とまったく同じ動作をします。IList<T>TFoldedObjectList<T>OwnsObjectFalseTList<T>

Spring4D コレクションはインターフェース ベースであるため、インターフェースの契約に従って動作する限り、インターフェースの背後にあるクラスは問題ではありません。

IList<T>リストは asと notだけ持ち運ぶようにしてください。TList<T>両方の方法でリストを作成できます (TCollectionsメソッドを使用するときに前述した利点があります)。私たち自身のアプリケーションでは、まだクラスのコンストラクターを使用している場所もあれば、.NET の静的メソッドを使用している場所もたくさんありますSpring.Collections.TCollections

ところで:

私はあなたのフォークでアクティビティを見ましたが、既にそこにあるため、Map/Reduce を実装する必要はありません。Spring4D コレクションは .NET に基づいてモデル化されているため、and と呼ばれますSelect( Aggregate「参考文献」を参照Spring.Collections.TEnumerable)。IEnumerable<T>ただし、インターフェイスは汎用のパラメーター化されたメソッドを持ってはならないため、直接使用することはできません。

于 2016-09-14T17:05:00.807 に答える