2011-10-11 41 views
4

有问题的数组是一个字节流。返回数组的问题是它不是只读的,因此库的客户端可以修改其内容。从库而不是数组返回什么样的集合类型?

有包装的阵列我不知道选哪个这么多不同的方式:

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

此外,返回类型可以是从实际的实例类型不同。

我最初的办法是做这样的事情:

Data = new ReadOnlyCollection<byte>(data);

data是一个字节数组。 Data属性应该是一些接口类型(IEnuerable,IList等等)。但是,我不确定要使用哪一个。我看到很多人推荐IEnumerable,因为它非常标准,但顺序很重要,在我看来,一串字节应该保持与数组的语法相似性。 IEnumerable不允许访问各个标记,因此它显然不是这里的最佳选择。

IList不是只读的,所以我想ICollection会是正确的..?不确定。似乎有这么多的集合类型,我对使用哪个类型感到困惑。

回答

2

我会试图返回IList<byte>并记录列表是不可变的。这为您提供了稍后更改实施的灵活性的混合体,但意味着呼叫者不需要使用IEnumerable<T>的“最低公分母”。

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

或者像达林提到,您可以使用Stream - 特别是MemoryStream

return new MemoryStream(data, false); 

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

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

1

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

+1

如果对象“拥有”数据并且不想让人们更改其数据,那么这很重要。是的,他们可以调用'ToArray'来创建一个副本,但这不是一回事 - 在没有必要的情况下强制*创建副本是一件令人遗憾的事情。 'MemoryStream'和'ReadOnlyCollection '在这方面都更好。 –

1

我会建议返回一个MemoryStream。你可以构造它,使它是只读的。

相关问题