不处理MemoryStream在处理使用它的StreamReader时有副作用吗?

时间:2012-07-30 16:11:58

标签: c# idisposable memorystream

给出以下代码片段:

try
{
    var myTxt = "";
    var serializer = new DataContractSerializer(myObject.GetType());
    var memoryStream = new MemoryStream()

    serializer.WriteObject(memoryStream, myObject);
    memoryStream.Position = 0;

    using (var reader = new StreamReader(memoryStream))
    {
        myTxt = reader.ReadToEnd();
    }
    .
    .
    .
}
catch (IOException ioEx)
{
     //log or whatever...        
     throw;
}

通常我的内存流周围都有一个using语句, 但根据我的理解,处理StreamReader将关闭内存流。

所以问题是,上面有什么真正的错误吗?

4 个答案:

答案 0 :(得分:3)

您可以简化代码,因为我没有看到写作,倒带和阅读的重点:

var serializer = new DataContractSerializer(facets.GetType());
using (var stream = new MemoryStream())
{
    serializer.WriteObject(stream, facets);
    string xml = Encoding.UTF8.GetString(stream.ToArray());
}

答案 1 :(得分:1)

使用

是一个好习惯
using (var stream = new MemoryStream(...))
using (var reader = new StreamReader(stream))
{
    myTxt = reader.ReadToEnd();
}

此处流和阅读器都将按运行时处理

Close()手动读取器(编写器)和流

答案 2 :(得分:1)

为了测试你的场景,我添加了

memoryStream.Seek(0, SeekOrigin.Begin);

到最后并收到System.ObjectDisposedException,您的代码似乎有效。

当然vcsjones的评论也有效。

答案 3 :(得分:1)

我觉得很好,因为MemoryStream无法保留非托管资源,但如果你想要更加安全,你可以这样做:

var memoryStream = new MemoryStream()
StreamReader reader = null;
try{
    serializer.WriteObject(memoryStream, myObject);

    memoryStream.Position = 0;
    reader = new StreamReader(memoryStream)
    //...
}
finally
{
    if(reader != null)
        reader.Dispose();
    else
        memoryStream.Dispose();
}