从方法返回内存流

Kan*_*nan 5 .net c# dispose memorystream using

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

Aspx页面包含以下内容.

private void Generator(input)
{
    using (MemoryStream memoryStream = Helper.Instance.Generate(input))
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

从返回内存流的aspx页面调用下面的方法.

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

    return stream;
}
Run Code Online (Sandbox Code Playgroud)

Joe*_*Joe 8

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

    // doing some stream manipulation here
    
    Run Code Online (Sandbox Code Playgroud)

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

  • 第二点: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;
    }
}  
Run Code Online (Sandbox Code Playgroud)

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


Ign*_*cia 0

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

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

 private void Generator(input)
 {
    using (MemoryStream memoryStream = new MemoryStream())
    {
        Helper.Instance.Manipulate(memoryStream);
    }
 }
Run Code Online (Sandbox Code Playgroud)