什么';s是物化集合的最低类型要求

本文关键字:类型 集合 什么 | 更新日期: 2023-09-27 18:21:09

如果我正在序列化一个对象集合,那么保证该集合物化(而不是表达式的结果)的最低类型是什么?

例如,这不应该是可能的:

var message = new MyMessage {
  Recipients = someCollection.Select... // <- this can't be deserialized without calling ToList()
}

我知道IList会做这项工作,但我想知道这是否是的最低要求。

什么';s是物化集合的最低类型要求

我知道IList会做的工作

事实上,不会。任何接口都不可能有这样的保证,因为我总是可以实现该接口,将任何查询的具体化推迟到调用某些接口方法。现在,根据惯例,实现IList的类型将是一个物化集合,而不是推迟工作的东西,但这并不能保证。

要保证,您需要使用具体的类型而不是接口,接受数组、List等。

当然,您可以选择接受IEnumerable之类的接口,然后自己将其具体化到集合中(可能作为第三个重载,其中包含数组和列表的重载,以避免重新具体化这些重载),因为如果您自己已经具体化了它,那么就知道这不会推迟执行。

你不能无论集合是物化的还是查询,最终都是不通过任何普通公共API公开的实现细节。但是,如果您想合理地确定给定的常见类型,可以使用ICollection<T>

CCD_ 5要求CCD_ 6可用。IList<T>进一步要求您可以通过索引访问元素。既然你似乎不需要IEnumerable<T>以外的任何东西,我推荐ICollection<T>,例如

public ICollection<Recipient> Recipients { get; set; }

如果确保集合物化比能够轻松使用内置类型和方法更重要,那么创建IMaterializedIMaterializedEnumerable<T> : IEnumerable<T>标记接口和实现它的类也可能很有用。