从库而不是数组返回的集合类型

本文关键字:集合 集合类 类型 返回 数组 | 更新日期: 2023-09-27 18:11:04

所讨论的数组是字节流。只返回一个数组的问题是它不是只读的,因此库的客户端可以修改它的内容。

有这么多不同的方式来包装数组,我不知道该选择哪一个:

IEnumerable, IList, List, ReadOnlyCollection, Collection, et cetera.

返回类型也可以不同于实际实例化的类型。

我最初的方法是这样做的:

Data = new ReadOnlyCollection<byte>(data);

其中data为字节数组。Data属性将是某种接口类型(ienumerable、IList等)。然而,我不知道该用哪一种。我看到很多人推荐IEnumerable,因为它非常标准,但顺序在这里很重要,在我看来,字节流应该保持与数组的语法相似之处。IEnumerable不允许访问单独的索引,所以它显然不是这里的最佳选择。

IList不是只读的,所以我想iccollection是正确的…?我也不确定。似乎有这么多的集合类型,我有点困惑,至于使用哪一个。

从库而不是数组返回的集合类型

我很想返回IList<byte>并说明列表是不可变的。这为您提供了稍后更改实现的灵活性,但意味着调用者不需要使用IEnumerable<T>的"最低公分母"。

使用IList<byte>作为声明类型,您仍然可以返回ReadOnlyCollection<byte>作为实现。

或者正如Darin提到的,您可以使用Stream—特别是MemoryStream:

return new MemoryStream(data, false);

将是一个只读流。如果客户端想要读取数据作为流(例如传递给XML解析器或图像加载器等),那么这将是最好的。您只需要将它声明为返回Stream—显式声明它返回MemoryStream几乎没有什么好处(当然,除非调用者想调用ToArray)。你应该记录返回的流是可读的,可搜索的,但不可写的。

如果他们真的想把它当作一个集合,IList<T>是更好的。

直接返回Stream而不是字节数组如何?根据您期望客户能够对结果做什么,可能会有不同的方法。如果他们可以修改字节数组,真的有那么糟糕吗?即使您返回一个IEnumerable<T>,它们仍然可以调用.ToArray()扩展方法并获得一个字节数组。所以我不认为从消费者那里修改内存中的字节数组对你来说应该是一个问题。

我建议返回一个MemoryStream。您可以将其构造为只读。