假设我有一个带有方法的字符串类ToStream()。
class FooBar
{
pubic Stream ToStream( )
{
byte[ ] barFooBytes = Encoding.UTF8.GetBytes( this.BarFoo );
return new MemoryStream( barFooBytes );
}
}
Run Code Online (Sandbox Code Playgroud)
现在假设我有一个班级正在获取此流。
class BarFoo
{
pubic void DoCrazyStuff( )
{
using( Stream fooBarStream = ( new FooBar( ) ).ToStream( ) )
{
// Doing some really crazy stuff!
}
}
}
Run Code Online (Sandbox Code Playgroud)
using使用创建流的方法外部仍然有意义吗?
提示: 这不是真实的现实生活场景。这是一个纯粹的技术问题。因此,这段代码被缩小只是为了澄清问题。
使用using/ IDisposable,可以随时回答的重要问题是“谁拥有这个对象?”。在这种情况下,该ToStream方法必须返回 a Stream,因此虽然它在运行时拥有该对象,但它和它所属的类不承担进一步的责任。因此,它不会Dispose或将其包装在using.
因此,我们可以确定对象的所有权已传递回方法的调用者ToStream。因此,作为对象的新所有者,您有责任将其using手动包装在 中Dispose,或将所有权传递给其他对象。
正如约翰的回答和下面的评论所指出的那样,MemoryStream具体来说, a 并没有从Dispose调用它中获得显着的好处(缓冲区仍然被分配)。但是,它实现了Dispose,因为它继承自并且按照合同,您的方法承诺提供的Stream所有内容都是 a ,而不是 a ,因此/对于调用者来说是正确的。ToStreamStreamMemoryStreamusingDispose