59

我有一个函数,它生成并返回一个 MemoryStream。生成后 MemoryStream 的大小是固定的,我不再需要写入它,只需要输出。例如,写入 MailAttachment 或写入数据库。

将物体交给周围的最佳方法是什么?MemoryStream 还是字节数组?如果我使用 MemoryStream 我必须在读取后重置位置。

4

3 回答 3

70

如果您必须将所有数据保存在内存中,那么在许多方面选择是任意的。如果您有在 上运行的Stream现有代码,那么MemoryStream可能会更方便,但是如果您返回 a byte[],您总是可以将其包装在 a new MemoryStream(blob) Anyway中。

它还可能取决于它有多大以及您持有它多长时间;MemoryStream可以超大,这有优点也有缺点。如果您将数据保存一段时间,将其强制为 abyte[]可能会很有用,因为它会修剪掉多余的部分;但是,如果您只是简单地保留它,它可能会适得其反,因为它会迫使您在创建新副本时复制大部分(绝对最少:一半)数据。

所以; 这在很大程度上取决于上下文、用法和意图。在大多数情况下,“无论哪个有效,并且清晰简单”就足够了。如果数据特别大或保存时间很长,您可能需要故意对其进行一些调整。

该方法的另一个优点是byte[]:如果需要,多个线程可以一次安全地访问它(只要它们正在读取)——这不是MemoryStream. 但是,这可能是一个错误的优势:大多数代码不需要byte[]从多个线程访问。

于 2012-08-06T12:52:15.757 回答
6

MemoryStream 类用于向流中添加元素。有一个文件指针;它模拟随机访问,这取决于它是如何实现的。因此,MemoryStream 并非旨在随时访问任何项目。

字节数组允许在任何时候随机访问任何元素,直到它被取消分配。

在字节 [] 旁边,MemoryStream 存在于内存中(取决于类的名称)。那么最大分配大小为 4 GB。

最后,如果您需要访问任何索引号的数据,请使用字节 []。否则,MemoryStream 旨在与其他需要流作为输入的东西一起工作,而你只有一个字符串。

于 2017-05-27T08:57:24.150 回答
1

使用 byte[] 因为它是一个固定大小的对象,使得内存分配和清理更容易,并且相对没有开销 - 特别是因为您不需要使用 MemoryStream 的功能。此外,您希望尽快处理该流,以便它可以释放它可能正在使用的可能的非托管资源。

于 2012-08-06T12:52:45.993 回答