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

拿东西最好的方式是什么?MemoryStream还是Byte Array?如果我使用MemoryStream,我必须在读取后重置位置.

推荐答案

如果必须将所有数据保存在内存中,那么在许多方面, Select 是任意的.如果您有现有的代码that operates on 100,那么MemoryStream可能更方便,但是如果您返回byte[],那么您总是可以将其包装在new MemoryStream(blob) anyway中.

这也可能取决于它有多大,你持有它的时间有多长;MemoryStream可以是oversized,这是有好处也有坏处的.如果您将数据保留一段时间,则强制将其设置为byte[]可能会很有用,因为它将削减任何多余的数据;但是,如果您只短暂地保留它,则可能会适得其反,因为在创建新副本时,它将强制您将大部分数据(至少是绝对最小:一半)设置为duplicate.

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

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

Asp.net相关问答推荐

*不*使用 asp.net 会员提供程序是个坏主意吗?

在 aspx 页面中使用 if else 和 eval

httpCompression 和 urlCompression 有什么区别?

如何使用 ASP.NET Identity 创建用户并获取新创建的 ID

我可以在 Visual Studio 2010 中将任务列表项添加到 csHTML 吗?

Jquery asp.net 按钮单击事件通过 ajax

无法使用单例Microsoft.AspNetCore.Hosting.Internal.HostedServiceExecutor中的范围服务MyDbContext

在 Asp.net mvc5 中使用用户名而不是邮箱作为身份

回发后动态创建的控件丢失数据

.Net Standard 2.0 类库是否有通用配置文件?

LINQ to Entities 无法识别 MVC 4 中的System.String ToString()方法

如何确定服务器端 C# 上的浏览​​器窗口大小

如何在 ASP.Net 的客户端 (JavaScript) 上判断 Page.Validate()?

Owin.IAppBuilder不包含MapSignalR的定义

如何在 ASP.NET MVC 中启用跨源请求

SQLServer 与 StateServer 的 ASP.NET 会话状态性能

Cache.Add 绝对过期 - 是否基于 UTC?

如何获取程序集的最后修改日期?

如何将我的 Autofac 容器插入 ASP. NET 身份 2.1

如何在不遍历每个循环的情况下从字典对象中获取所有键(仅键)