c#MemoryStream vs Byte Array

Luc*_*ike 43 .net c# asp.net

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

交付物体的最佳方法是什么?MemoryStream还是Byte数组?如果我使用MemoryStream,我必须在读取后重置位置.

Mar*_*ell 51

如果你必须将所有数据保存在内存中,那么在许多方面,选择是任意的.如果您有现有的代码,其操作上Stream,则MemoryStream可能会更方便,但如果你返回byte[]你可以随时只是包装在一个new MemoryStream(blob) 反正.

它可能还取决于它有多大以及它持有多长时间; MemoryStream可以超大,这有利有弊.byte[]如果你持有一段时间的数据,强制它可能是有用的,因为它会削减任何多余的数据; 但是,如果您只是简单地保留它,则可能会适得其反,因为它会强制您在创建新副本时复制大多数(绝对最少:一半)数据.

所以; 它在很大程度上取决于背景,用法和意图.在大多数情况下,"无论哪种工作,而且清晰简单"都可能就足够了.如果数据特别大或持续较长时间,您可能需要刻意调整一下.

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

  • 有趣的是,`MemoryStream`在内部以任何速率使用`byte []`,因此它更多地讨论了所需的API - "流"或数组. (3认同)
  • 正是@Adam;**超大**内部“byte[]”可以通过“GetBuffer()”获得,但是您需要非常小心,不要查看超出范围的字节,它们纯粹是垃圾。 (2认同)

小智 6

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

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

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

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