我有一个函数,它生成并返回一个MemoryStream。生成后,MemoryStream的大小是固定的,我不再需要写入它只需要输出。例如,写入MailAttachment或写入数据库。
交出物体的最佳方法是什么? MemoryStream还是Byte数组?如果我使用MemoryStream,我必须在读取后重置位置。
答案 0 :(得分:47)
如果必须将所有数据保存在内存中,那么在许多方面,选择是任意的。如果您的现有代码在Stream
上运行,那么MemoryStream
可能会更方便,但如果您返回byte[]
,则可以随时将其包裹在无论如何new MemoryStream(blob)
。
它可能还取决于它有多大以及你持有多久; MemoryStream
可以超大,这有利有弊。如果您持有一段时间的数据,强制它为byte[]
可能会有用,因为它会削减任何多余的数据;但是,如果您只是简单地保留它,则可能会适得其反,因为在您创建新副本时,它会强制您复制大多数(绝对最少:一半)数据。
因此;它在很大程度上取决于背景,用法和意图。在大多数情况下,“无论哪种工作,而且清晰简单”都可能就足够了。如果数据特别大或长时间保存,您可能需要刻意调整一下。
byte[]
方法的另一个优点:如果需要,多个线程可以一次安全地访问它(只要它们正在读取) - MemoryStream
不是这样。但是,这可能是一个错误的优势:大多数代码都不会需要从多个线程访问byte[]
。
答案 1 :(得分:3)
MemoryStream类用于向流添加元素。 有一个文件指针;它模拟随机访问,它取决于它的实现方式。因此,MemoryStream不能随时访问任何项目。
字节数组允许随时访问任何元素,直到它被取消分配。
在byte []旁边,MemoryStream存在于内存中(取决于类的名称)。然后最大分配大小为4 GB。
最后,如果需要访问任何索引号的数据,请使用byte []。否则,MemoryStream旨在与其他需要流作为输入的东西一起工作,而你只需要一个字符串。
答案 2 :(得分:1)
使用byte [],因为它是一个固定大小的对象,使内存分配和clranup更容易,并且相对没有开销 - 特别是因为您不需要使用MemoryStream的功能。此外,您希望尽快处理该流,以便它可以释放它可能正在使用的非托管资源。