在从方法返回的流上使用 `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
对来电者来说是正确的。
假设我有一个字符串 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
对来电者来说是正确的。