当前位置 : 主页 > 编程语言 > delphi >

delphi – 为什么我应该使用TCollections.CreateList而不是TList.Create

来源:互联网 收集:自由互联 发布时间:2021-06-23
我将map(),reduce()和where(qlint:string)添加到我的 Spring4D分支中. 当我编写这些函数时,我发现列表的行为在以不同方式创建时存在差异. 如果我使用TList TSomeClass创建它们.创建可枚举的对象是
我将map(),reduce()和where(qlint:string)添加到我的 Spring4D分支中.
当我编写这些函数时,我发现列表的行为在以不同方式创建时存在差异.

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

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

所以问题是:

使用TList< TSomeClass> .create有不足之处吗?
换句话说:我为什么要使用TCollections.CreateList< TSomeClass> ?

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

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

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

至于TCollections.CreateList< T>返回IList< T>由TFoldedObjectList< T>支持的当T是一个完全按照设计的类.由于OwnsObject被传递为False,因此它具有与TList< T>完全相同的行为.

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

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

BTW:

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

网友评论