将memoryStream作为字符串返回

WeN*_*ers 1 c#

这个陈述有什么问题?

return Encoding.ASCII.GetString(memoryStream.GetBuffer(), 0, memoryStream.Length)
Run Code Online (Sandbox Code Playgroud)

我知道Dispose模式,检查了底层的memoryStream,发现在dispose中没有发生任何事情.那么为什么我不允许我的一个开发人员这样做呢.

返回后,memoryStream超出范围.

目的是使代码简洁而不创建不需要的引用,希望尽快让垃圾收集器启动.

它只是让我感到唠叨,我觉得memoryStream让派对失败了,与其他流做的相比,以及为什么他们实现了IDispose.

有人可以给我一个很好的理由不允许上面的代码.我对代码不正确但需要一些备份感到胆怯.:)

****WeNeedAnswers****:编辑请注意由于Jon Skeets输入代码已经改变,但这个问题主要核心仍然相关.

我的原始和容易出错的代码是:

return new ASCIIEncoding().GetString(memoryStream.ToArray());
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 5

就个人而言我会用:

string text;
memoryStream.Position = 0;
using (TextReader reader = new StreamReader(memoryStream, Encoding.ASCII))
{
    text = reader.ReadToEnd();
}
Run Code Online (Sandbox Code Playgroud)

作为一种更通用的方式 - 但你的代码至少应该起作用.如果您的目标是不创建超出需要的对象,则应使用Encoding.ASCII而不是创建新实例.如果你对复制真的很偏执,你可以使用:

string text = Encoding.ASCII.GetString(memoryStream.GetBuffer(),
                                       0, memoryStream.Length);
Run Code Online (Sandbox Code Playgroud)

这样可以避免创建数据副本.

你似乎关心内存使用 - 你有什么理由吗?您是否进行过分析并发现垃圾收集是一个瓶颈?如果没有,不用担心它,直到你觉得这是一个问题.通常不是.

  • @WeNeedAnswers:我更喜欢代码是正确和健壮的.将它放在一个单独的方法中很容易,然后它可以在任何流上工作,而不必担心是否可以不处理流.至于处理 - 处理`StreamReader`为你处理底层流.说了这些,我通常会在代码*周围创建一个使用声明*.你没有表现出来. (6认同)