2011-07-26 41 views
3

我有以下定義。存儲匿名方法的容器

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

我應該使用什麼類型的容器(應D2009支持)來存儲TOmniTaskDelegate實例的列表?目前我正在使用array of TOmniTaskDelegate,但我對此並不滿意。

+0

爲什麼你不喜歡陣列? –

+0

a)因爲我想將責任委託給一個定義良好的接口的容器,並且b)因爲我現在每次給它添加一些東西時就調整數組的大小。誠然,我可以寫一個很好的包裝陣列,它會知道當前的大小和分配的大小等,但是我已經重新實施TSomeList ,我寧願使用Delphi提供的東西(假設存在這樣的東西)。 – gabr

+2

什麼是TSomeList ?你不能只使用'TSomeList '嗎? –

回答

8

我會使用TList<TOmniTaskDelegate>。由於使用泛型會導致類型安全,因此它將正確處理其成員的生命期問題。

+1

我在想Genericics.Collections中的'TList '。這確實涉及到引用計數,因爲它是類型安全的。但是現在我懷疑它可能不包含在D2009中。 –

+0

TObjectList不是適當的容器,因爲匿名方法引用需要包含對方法的引用以及對接口「自我」的引用。換句話說,大小將是2 x SizeOf(指針)。 –

+0

@Cosmin這只是一個愚蠢的錯誤,我的意思是'TList '當然。 –

3

編輯:德爾福2009年包含了一般TList<T>,我認爲它的使用array of實現的,就像一個在2010年德爾福這使得TList<T>的最佳選擇!我的原始答案保留,因爲它解釋了爲什麼array of是一個很好的數據結構,爲什麼不是使用它是一個很大的麻煩。


你選擇的array of Anonym看起來對我很好,因爲:

  • 匿名方法的管理實體(使用接口來實現)。他們需要妥善敲定。
  • 動態數組本身是一個託管類型,確保匿名方法引用已正確定稿。
  • Delphi 2010通用容器是使用動態數組實現的,因此它們可以完成任務。但要確保你不會一個接一個地增加你的陣列,而是要大塊地增長。

如果你使用其他任何東西來實現,你需要照顧自己完成引用。例子:

  • 如果您使用的內存塊平原,你需要的是故意設置每個項目的零析構函數(即:不ZeroMemory或FillChar),因此編譯器都有機會生成終止代碼。
  • 記錄是託管對象,它們可以保存對動態方法的引用,但它們只能容納有限數量的引用,如果需要更多,則需要實現一種鏈接列表,然後您需要仔細管理那裏的生命週期。
  • 類承受記錄的所有缺陷,並且在它們之上添加它們自己的開銷層。
+1

在你的情況下,你正在實現一個基本類型(一種基本的新類型的列表),我不相信泛型和編譯器可以被信任而不會做一些可能會弄亂過程的東西引用。如果我打算使用除ProcRef數組以外的其他內容,那麼我將使用TList 並將過程引用放入記錄類型中。 –

+1

'array of'對於列表的私有實現來說很好,但我絕不希望將它用作主數據類型。如果你不能使用'TList '然後創建你自己的樣子。 –