在从方法返回的流上使用 `using()`

`using()` on a stream returned from a method

假设我有一个字符串 class 和一个方法 ToStream().

class FooBar
{
    pubic Stream ToStream( )
    {
        byte[ ] barFooBytes = Encoding.UTF8.GetBytes( this.BarFoo );
        return new MemoryStream( barFooBytes );
    }
}

现在假设我有 class 获取此流。

class BarFoo
{
    pubic void DoCrazyStuff( )
    {
        using( Stream fooBarStream = ( new FooBar( ) ).ToStream( ) )
        {
            // Doing some really crazy stuff!
        }
    }
}

在创建流的方法之外使用 using 是否仍然有意义?

提示: 这不是真实的现实生活场景。这是一个纯粹的技术问题。所以这个代码被缩小只是为了澄清问题。

有了using/IDisposable,能够随时回答的重要问题是"who owns this object?"。在这种情况下,ToStream 方法必须 return 一个 Stream,所以当它拥有对象时它是 运行,它和 class 它是一部分不对此承担进一步的责任。因此它不会 Dispose 或将其包装在 using.

因此,我们可以确定对象的所有权已返回给 ToStream 方法的调用者。因此,作为对象的新所有者,您有责任将其包装在 using 中,手动 Dispose 或将所有权传递给其他对象。


正如 John's answer 及其下方的评论所指出的,MemoryStream 并没有显着受益于对其调用 Dispose(缓冲区保持分配状态)。但是,它实现了 Dispose,因为它继承自 Stream 并且根据合同,您的 ToStream 方法承诺提供的是 Stream,而不是 MemoryStream,所以using/Dispose 对来电者来说是正确的。