为什么我应该使用 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 是正确的类型,而不仅仅是 TObject
或 IInterface
。在柏林,它为每个不同的对象列表增加了不到 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 之后建模的,因此它们被称为 Select
和 Aggregate
(请参阅 Spring.Collections.TEnumerable
)。它们不能直接在 IEnumerable<T>
上使用,因为接口不能有泛型参数化方法。
我将 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 是正确的类型,而不仅仅是 TObject
或 IInterface
。在柏林,它为每个不同的对象列表增加了不到 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 之后建模的,因此它们被称为 Select
和 Aggregate
(请参阅 Spring.Collections.TEnumerable
)。它们不能直接在 IEnumerable<T>
上使用,因为接口不能有泛型参数化方法。