3

我在我的 Spring4D 分支中添加了 map()、reduce() 和 where(qlint : string)。当我对这些函数进行编程时,我发现列表的行为有所不同,当它们以不同的方式创建时。

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

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

所以问题是:

使用有缺点TList<TSomeClass>.create吗?
或者换句话说:我为什么要使用TCollections.CreateList<TSomeClass>


顺便说一句:使用 TCollections.CreateList 我得到了 TObjectList 而不是 TList。所以它应该被称为 TCollections.CreateObjectList... 但那是另一回事了。

4

1 回答 1

12

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

如果您要创建许多不同类型的IList<T>(其中 T 是类或接口),这将大大减少二进制文件的大小,因为它将它们折叠成TFolded(Object|Interface)List<T>. 但是,通过界面,您可以按照指定的方式访问项目,并且该ElementType属性返回正确的类型,而不仅仅是TObjector IInterface。在柏林,它为每个不同的对象列表添加不到 1K,而如果由于您可以在IList<T>.

至于当 T 是一个完全符合设计的类时,TCollections.CreateList<T>返回一个IList<T>由 a 支持的。TFoldedObjectList<T>由于OwnsObject已通过,因为False它具有与 a 完全相同的行为TList<T>

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

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

顺便提一句:

我在您的 fork 中看到了活动,并且 imo 不需要实现 Map/Reduce,因为它已经存在。由于 Spring4D 集合是在 .NET 之后建模的,因此它们被称为SelectAggregate(请参阅参考资料Spring.Collections.TEnumerable)。但是它们不能IEnumerable<T>直接使用,因为接口不能具有通用参数化方法。

于 2016-09-14T17:05:00.807 回答