我为什么要使用TCollections.CreateList <T>而不是TList <T> .Create

Ben*_*ikt 3 delphi spring4d

我将map(),reduce()和where(qlint:string)添加到我的Spring4D分支中.当我编写这些函数时,我发现列表的行为在以不同方式创建时存在差异.

如果我用TList<TSomeClass>.create枚举中的对象创建它们的类型TSomeClass.

如果我用TCollections.CreateList<TSomeClass>枚举中的对象创建它们的类型TObject.

所以问题是:

使用是否存在缺点TList<TSomeClass>.create
换句话说:我为什么要用TCollections.CreateList<TSomeClass>


顺便说一句:使用TCollections.CreateList我有一个TObjectList而不是TList.所以它应该被称为TCollections.CreateObjectList ...但那是另一个故事.

Ste*_*nke 11

根据编译器版本的不同,许多Spring.Collections.TCollections.Create方法都应用了编译器无法实现的功能:将实现折叠成一个非常简单的泛型类.有些方法是从XE开始做的,有些只是因为XE7(GetTypeKind内部函数可以在编译时进行类型解析 - TCollections.CreateList<T>例如参见无参数).

如果要创建许多不同类型IList<T>(其中T是类或接口),这会大大减少二进制大小,因为它会将它们折叠成TFolded(Object|Interface)List<T>.但是,通过接口,您可以按照指定的方式访问项目,并且ElementType属性也会返回正确的类型,而不仅仅是TObjectIInterface.在柏林,它为每个不同的对象列表添加不到1K,而如果不应用折叠则会增加大约80K,因为您可以调用的不同操作涉及所有内部类IList<T>.

至于TCollections.CreateList<T>返回一个IList<T>TFoldedObjectList<T>T 支持的时候T是一个完全按照设计的类.由于OwnsObject是通过为False它具有完全相同的行为的TList<T>.

Spring4D集合是基于接口的,因此只要它的行为与接口的契约相对应,接口后面的类就无所谓.

确保你只携带列表IList<T>而不是TList<T>- 你可以两种方式创建它们(使用我之前提到的使用TCollections方法的好处).在我们自己的应用程序中,一些地方仍在使用类的构造函数,而许多其他地方正在使用静态方法Spring.Collections.TCollections.

BTW:

我在你的fork和imo中看到了活动,没有必要实现Map/Reduce,因为那已经存在了.由于Spring4D集合后,.NET模仿他们被称为SelectAggregate(见Spring.Collections.TEnumerable).它们不能IEnumerable<T>直接使用,因为接口必须没有通用的参数化方法.