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

Why should i use TCollections.CreateList<T> and not TList<T>.Create

我将 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... 但那是另一回事了。

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

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

至于 TCollections.CreateList<T> 返回由 TFoldedObjectList<T> 支持的 IList<T> 当 T 是完全按设计的 class 时。由于 OwnsObject 作为 False 传递,它具有与 TList<T>.

完全相同的行为

Spring4D 集合是基于接口的,因此 class 接口背后的内容无关紧要,只要它的行为符合接口的约定即可。

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

的静态方法

顺便说一句:

我在你的 fork 中看到了 activity,我认为没有必要实施 Map/Reduce,因为它已经存在了。由于 Spring4D 集合是在 .NET 之后建模的,因此它们被称为 SelectAggregate(请参阅 Spring.Collections.TEnumerable)。它们不能直接在 IEnumerable<T> 上使用,因为接口不能有泛型参数化方法。