假设我有一个带有方法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
仍然有意义吗?
提示: 这不是实际的现实情况。这是一个纯粹的技术问题。因此,将这些代码最小化只是为了阐明问题。
答案 0 :(得分:4)
使用using
/ IDisposable
,可以随时回答的重要问题是“谁拥有这个对象?”。在这种情况下,ToStream
方法必须返回一个Stream
,因此尽管它在运行时拥有对象,但它和它所包含的类不承担任何责任。因此,它不会Dispose
或将其包装在using
中。
因此,我们可以确定该对象的所有权已传递回ToStream
方法的调用者。因此,作为对象的新所有者,您有责任将其包装在using
中,手动对其进行Dispose
或将所有权传递给其他对象。
正如John's answer及其下面的注释所指出的,MemoryStream
并没有从Dispose
被调用(缓冲区仍然分配)中受益。但是,它实现了Dispose
,因为它是从Stream
继承而来的,根据约定,您的ToStream
方法承诺提供的只是Stream
,而不是MemoryStream
,因此using
/ Dispose
对呼叫者正确。