C# 返回具有未处置内存流的对象会导致内存泄漏吗?

C# 返回具有未处置内存流的对象会导致内存泄漏吗?,c#,dispose,using,C#,Dispose,Using,我遇到过这样一个例行程序: static public Bitmap byte2bmp(byte[] BitmapData) { MemoryStream ms = new MemoryStream(BitmapData); return (new Bitmap(ms)); } 我担心这可能不是最好的推荐方法。在这种情况下,ms是否得到正确处置 或者最好将结果分配给临时位图,处理流,然后返回临时对象 static public Bitmap byte2bmp(byte[] Bi

我遇到过这样一个例行程序:

static public Bitmap byte2bmp(byte[] BitmapData)
{
    MemoryStream ms = new MemoryStream(BitmapData);
    return (new Bitmap(ms));
}
我担心这可能不是最好的推荐方法。在这种情况下,ms是否得到正确处置

或者最好将结果分配给临时位图,处理流,然后返回临时对象

static public Bitmap byte2bmp(byte[] BitmapData)
{
    MemoryStream ms = new MemoryStream(BitmapData);
    Bitmap temp=new Bitmap(ms);
    ms.Dispose();
    return (temp);
}
我希望在这个场景中可以使用“using”,但不确定它是否会正常工作:

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

最有效/最恰当的解决方案是什么?谢谢

您担心第一种方法将无法使用
ms
。作为一种良好实践,您应该始终在实现
IDisposable
的对象上调用
Dispose
方法

我建议采用最后一种方法。您可以确信,<<代码>使用St声明会像预期的那样处理对象,即使在中间返回它。

下面是代码在运行时的分解方式:首先,将对返回表达式求值,然后执行try-finally块(对于该块,简单地说是语法糖),最后返回方法

<> >使用语句时,您可能遇到在<>代码中间返回的问题。当然,如果使用块在
范围之外保留对变量的任何引用,这将导致问题


另见:

@LukeH:我不确定我是否理解你的意思。C#规范指出返回表达式将在处理流对象的
finally
块之前首先求值,因此
位图
构造函数决定做什么都无关紧要。我错了,但不是那样。如果关闭/处置流,
位图
类可能会中断。来自MSDN:“您必须在
位图的生存期内保持流的打开状态”@LukeH:Ah,好的。我以前从未注意到这一点。您现在有什么理由相信这不会导致任何问题和/或以上代码的工作不只是依赖于实现细节?在我最初的评论中,我说,
Bitmap
类不应该/不会这样做,因为这是一种不好的做法。不幸的是,我错了,因为它确实错了。(可能它在内部持有对流的引用,然后在以后重新使用它,而不是在第一次调用构造函数时急切地将流转换为
字节[]
或任何东西。)使用返回(新位图(ms).Clone(rect,pixFormat))“绕过”在原始BMP生命周期内打开流的要求吗?