2011-07-26 15 views
3

私には次の定義があります。匿名メソッドを格納するコンテナ

type 
    TOmniTaskDelegate = reference to procedure(const task: IOmniTask); 

私はTOmniTaskDelegateインスタンスのリストを格納する(D2009でサポートされなければならない)コンテナのどのようなタイプを使用する必要がありますか?現在私はarray of TOmniTaskDelegateを使用していますが、私はそれには本当に満足していません。

+0

なぜあなたは配列に満足していませんか? –

+0

a)私は何かを追加するたびに配列のサイズを変更するので、私はよく定義されたインターフェイスとb)を持つコンテナに責任を委託したいと思います。実際、現在のサイズと割り当てられたサイズなどを知っている配列の周りに素敵なラッパーを書くことができましたが、TSomeList を既に実装していて、Delphiで提供されているものを使用したいと思います。 – gabr

+2

'TSomeList 'とは何ですか? 'TSomeList 'を使用できませんでしたか? –

答えて

8

私はTList<TOmniTaskDelegate>を使用します。これはジェネリックの使用により型保証されているので、メンバの生涯の問題を正しく扱います。

+1

Generics.Collectionsの 'TList 'について考えています。タイプセーフなので、これは参照カウントを処理します。しかし、今私はそれがD2009に含まれていないかもしれないというごめんなさい疑いがあります。 –

+0

TObjectListは適切なコンテナではありません。匿名メソッド参照は、メソッドの参照とインターフェイスの「自己」への参照を含める必要があるためです。つまり、サイズは2 x SizeOf(Pointer)になります。 –

+0

@コスミンそれはちょっとばかげた過ちです。もちろん、私は 'TList 'を意味しました。 –

3

編集は:Delphi 2009には、私はそれがちょうどTList<T>最適な選択肢となりデルファイ2010年の一人として、array ofを使用して実装だと仮定し、一般的なTList<T>が含まれています! array ofが偉大なデータ構造であり、理由はなぜではないのかを説明しているので、私の元の答えはそのままです。それは多くの問題です。

  • 匿名メソッドは、(インターフェースを使用して実装)エンティティを管理していますので、


    array of Anonymのあなたの選択は、私にはとてもよさそうです。彼らは適切にファイナライズされる必要があります。

  • ダイナミック配列自体はマネージ型です。匿名メソッド参照が適切に確定されていることを確認してください。
  • Delphi 2010の汎用コンテナは動的配列を使用して実装されているため、それらはタスクに対応しています。しかし、配列を1つずつ増やしたり、まとまって成長したりしないようにしてください。

実装に他のものを使用する場合は、自分で参照を確定する必要があります。例:

  • あなたはメモリのプレーンブロックを使用する場合は(例:ZeroMemoryかFillCharない)意図的にnilに各項目を設定し、デストラクタが必要になりますので、コンパイラは、ファイナライズコードを生成する機会を得ます。
  • レコードは管理対象オブジェクトであり、動的メソッドへの参照を保持することもできますが、有限数の参照のみを保持できます。さらに必要な場合は、リンクリストを実装する必要があります。ライフサイクルを慎重に管理してください。
  • クラスはレコードの欠点に悩まされ、オーバーヘッドのレイヤーを追加します。
+1

あなたの場合、基本的な型(基本的な新しいタイプのリスト)を実装していて、ジェネリックスとコンパイラがプロシージャを台無しにするようなことをしないと信じられないとは思わない参照。 ProcRef配列以外のものを使用する場合は、TList を使用して、プロシージャー参照をレコードタイプに入れます。 –

+1

'array of'はリストのプライベートな実装では問題ありませんが、プライマリデータ型として使用することは決してありません。 'TList 'を使用できない場合は、独自の見た目を作成してください。 –

関連する問題