2016-09-14 84 views
2

我將map(),reduce()和where(qlint:string)添加到了我的Spring4D分支。 當我編程這些函數時,我發現列表的行爲有不同,當它們以不同的方式創建時。我爲什麼要使用TCollections.CreateList <T>而不是TList <T>。創建

如果我用TList<TSomeClass>.create創建它們,枚舉類型中的對象的類型爲TSomeClass

如果我用TCollections.CreateList<TSomeClass>創建它們,枚舉類型中的對象的類型爲TObject

所以,問題是:

是否有一個缺點用TList<TSomeClass>.create
或換句話說:我爲什麼要用TCollections.CreateList<TSomeClass>


BTW:與TCollections.CreateList我有一個TObjectList而不是從TList。所以它應該被稱爲TCollections.CreateObjectList ...但這是另一回事。

+1

不符合。 'TCollections.CreateList '返回'IList '。當你枚舉這些項目是「TSomeClass」類型的。換句話說,我質疑你在帖子中聲稱的所有內容。 –

+0

至於直接使用'TList '的缺點,我認爲如果你曾經參考一個它實現的接口,這將會變得很明顯。在這一點上,生命週期管理將被接口引用接管,並且您可能會發現它從下面消失。因此,使用'CreateList '並且按住'IList '或'IEnumerable '而不是執行類。這個庫的原理之一就是你不需要知道實現的細節。但是,我對Spring4d知之甚少,所以我可以在這裏得到完全錯誤的結果...... –

+0

這是很糟糕的解釋。不同之處僅在於「可數」。我正在編寫一些新的實習生函數給'TEnumerable'。在我的新函數中,RTTI調用的行爲有所不同,因爲我使用的是枚舉類型的泛型類型(我知道從一開始就是錯誤的,但很容易從頭開始)。對於剛上課的人來說,沒有什麼不同。 – Benedikt

回答

11

根據編譯器版本的不同,許多Spring.Collections.TCollections.Create方法正在應用編譯器無法做到的事情:將實現摺疊爲僅僅很細的泛型類。有些方法是從XE開始的,有些只是在XE7之後纔有的(GetTypeKind內部函數可以在編譯時進行類型分辨率 - 例如參見無參數TCollections.CreateList<T>)。

如果您創建許多不同類型的IList<T>(其中T是類或接口),因爲它將它們摺疊爲TFolded(Object|Interface)List<T>,這會大大減少二進制大小。但是通過界面,您可以按照您指定的項目訪問項目,並且ElementType屬性也會返回正確的類型,而不僅僅是TObjectIInterface。在柏林它爲每個不同的目標列表增加不到1K,而如果由於所有涉及不同操作的內部類可以調用IList<T>而不應用摺疊,它將增加80K左右。

至於TCollections.CreateList<T>返回一個IList<T>當T是一個完全按照設計的類時,支持TFoldedObjectList<T>。由於OwnsObject作爲False通過,它具有與TList<T>完全相同的行爲。

Spring4D集合是基於接口的,所以只要接口的行爲相應地接口後面的類是什麼都沒有關係。

請確保您僅將列表附帶在IList<T>而不是TList<T> - 您可以兩種方式創建它們(使用TCollections方法時我提到過的優點)。在我們自己的應用程序中,有些地方仍在使用類的構造函數,而其他許多地方正在使用來自Spring.Collections.TCollections的靜態方法。

BTW:

我看到了活動的叉子和國際海事組織也沒有必要實現的Map/Reduce,因爲這是已經存在。由於Spring4D集合是以後建模的。他們被稱爲SelectAggregate(見Spring.Collections.TEnumerable)。它們不直接在IEnumerable<T>上提供,因爲接口不能有通用的參數化方法。

+0

感謝您對「選擇」和「聚合」的提示。那delphi不允許在接口中使用通用的參數化方法,但也給我帶來了一些麻煩。這就是爲什麼我打開了四個默認地圖(),我可以通過IEnumerable 使用。我想我必須做一些關於delphi編譯器如何工作的功課。 – Benedikt

+0

btw:對不起,我沒有看到列表被創建與「OwnsObject = False」。那是我的錯。所以你的命名是對的:) – Benedikt

相關問題