从方法返回的流上的“ using()”

时间:2018-11-28 09:19:46

标签: c# using

假设我有一个带有方法ToStream()的字符串类。

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

现在假设我有一个正在获取此流的类。

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

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

提示: 这不是实际的现实情况。这是一个纯粹的技术问题。因此,将这些代码最小化只是为了阐明问题。

1 个答案:

答案 0 :(得分:4)

使用using / IDisposable,可以随时回答的重要问题是“谁拥有这个对象?”。在这种情况下,ToStream方法必须返回一个Stream,因此尽管它在运行时拥有对象,但它和它所包含的类不承担任何责任。因此,它不会Dispose或将其包装在using中。

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


正如John's answer及其下面的注释所指出的,MemoryStream并没有从Dispose被调用(缓冲区仍然分配)中受益。但是,它实现了Dispose,因为它是从Stream继承而来的,根据约定,您的ToStream方法承诺提供的只是Stream,而不是MemoryStream,因此using / Dispose对呼叫者正确。