返回带有非处置内存流的对象会导致内存泄漏吗?

时间:2011-01-05 10:06:59

标签: c# dispose using

我遇到过这样的例行程序:

static public Bitmap byte2bmp(byte[] BitmapData)
{
    MemoryStream ms = new MemoryStream(BitmapData);
    return (new Bitmap(ms));
}

我担心这可能不是最好的推荐方法。在这种情况下,ms是否正确处理?

或者将结果分配给临时Bitmap,处理流,然后返回临时对象会更好吗?

static public Bitmap byte2bmp(byte[] BitmapData)
{
    MemoryStream ms = new MemoryStream(BitmapData);
    Bitmap temp=new Bitmap(ms);
    ms.Dispose();
    return (temp);
}

我希望在这种情况下可以使用“使用”,但我不确定它是否会表现正常:

static public Bitmap byte2bmp(byte[] BitmapData)
{
    using(MemoryStream ms = new MemoryStream(BitmapData))
    {
    return (new Bitmap(ms));
    }
}

什么是最有效/最合适的解决方案?谢谢!

1 个答案:

答案 0 :(得分:2)

你担心第一种方法无法进行ms是正确的。作为一种良好实践,您应该始终对实现Dispose的对象调用IDisposable方法。

我建议采用最后一种方法。您可以确信using语句将按预期处理该对象,即使您在其中间返回也是如此。

以下是代码在运行时分解的方式:首先,将评估返回表达式,然后执行try-finally块(using statement只是语法糖),最后执行方法将返回。

using语句中间返回问题的唯一情况是if you return the variable from the using statement itself。当然,如果您保留对using块范围之外的变量的任何引用,这将导致问题。

另见:Best practice regarding returning from using blocks