从方法返回内存流

时间:2012-09-18 12:16:23

标签: c# .net dispose using memorystream

想知道以下情况是否会导致任何内存泄漏。

Aspx页面包含以下内容。

private void Generator(input)
{
    using (MemoryStream memoryStream = Helper.Instance.Generate(input))
    {
    }
}

从aspx页面调用下面的方法,该页面返回内存流。

MemoryStream Generate(input)
{
    MemoryStream stream = new MemoryStream();
    //doing some stream manipulation here

    return stream;
}

4 个答案:

答案 0 :(得分:8)

  • 第一点:如果代码抛出异常:

    // doing some stream manipulation here
    

    然后Helper.Instance.Generate不会返回MemoryStream,因此调用者不会处理它。

  • 第二点:MemoryStream不使用任何非托管资源,因此调用Dispose并不是必需的。

因此在这种情况下不会有内存泄漏。

如果抛出异常,强制在Helper.Instance.Generate中使用Dispose可能会更好:

MemoryStream Generate(input)  
{      
    MemoryStream stream = new MemoryStream();      

    try
    {
        //doing some stream manipulation here        

        return stream;  
    }
    catch
    {
        stream.Dispose();
        throw;
    }
}  

这是构造,操作和返回IDisposable对象的方法的一般模式。

答案 1 :(得分:0)

这是完全有效的,不会生成内存泄漏,因为在退出using块后会调用Dispose方法。

与执行以下操作完全相同:

 private void Generator(input)
 {
    using (MemoryStream memoryStream = new MemoryStream())
    {
        Helper.Instance.Manipulate(memoryStream);
    }
 }

答案 2 :(得分:0)

我认为始终如一地处理MemoryStreamDataTable之类的内容是有价值的......这样可以更轻松地读取代码并验证代码是否正确。如果您在using - 块中看到资源,那么您就知道它是正确的。无需进行心理流量追踪和模拟执行。

可以立即验证代码是否正确。没有想到。我觉得这很好。

那就是说,虽然我试图将不必要的东西放到using块中,但我并没有过头。如果有理由不处理它(甚至是开发人员的方便),我就是不这样做。

答案 3 :(得分:0)

@Joe已经提供了一些解释。对于实现IDisposable的对象,您可以尽早调用Dispose来回收资源(托管和/或非托管),但您可以决定不调用,因为CLR仍然跟踪它们并将通过终结器回收资源。通过终结器释放资源需要更多时间,但可以防止发生内存泄漏。

只有实现对象/类的人无法遵循设计准则并忘记正确编写终结器时,才会发生内存泄漏。

有大量文章和书籍提及细节,例如

http://msdn.microsoft.com/en-us/magazine/cc163392.aspx

http://www.bluebytesoftware.com/blog/PermaLink.aspx?guid=88e62cdf-5919-4ac7-bc33-20c06ae539ae