什么';s是物化集合的最低类型要求
本文关键字:类型 集合 什么 | 更新日期: 2023-09-27 18:21:09
如果我正在序列化一个对象集合,那么保证该集合物化(而不是表达式的结果)的最低类型是什么?
例如,这不应该是可能的:
var message = new MyMessage {
Recipients = someCollection.Select... // <- this can't be deserialized without calling ToList()
}
我知道IList会做这项工作,但我想知道这是否是的最低要求。
我知道IList会做的工作
事实上,不会。任何接口都不可能有这样的保证,因为我总是可以实现该接口,将任何查询的具体化推迟到调用某些接口方法。现在,根据惯例,实现IList
的类型将是一个物化集合,而不是推迟工作的东西,但这并不能保证。
要保证,您需要使用具体的类型而不是接口,接受数组、List
等。
当然,您可以选择接受IEnumerable
之类的接口,然后自己将其具体化到集合中(可能作为第三个重载,其中包含数组和列表的重载,以避免重新具体化这些重载),因为如果您自己已经具体化了它,那么就知道这不会推迟执行。
你不能无论集合是物化的还是查询,最终都是不通过任何普通公共API公开的实现细节。但是,如果您想合理地确定给定的常见类型,可以使用ICollection<T>
。
CCD_ 5要求CCD_ 6可用。IList<T>
进一步要求您可以通过索引访问元素。既然你似乎不需要IEnumerable<T>
以外的任何东西,我推荐ICollection<T>
,例如
public ICollection<Recipient> Recipients { get; set; }
如果确保集合物化比能够轻松使用内置类型和方法更重要,那么创建IMaterialized
或IMaterializedEnumerable<T> : IEnumerable<T>
标记接口和实现它的类也可能很有用。