将MemoryStream包装在一个使用中

gin*_*boy 10 .net c# stream

我已经告诉System.IO.MemoryStream不必在被包装使用的块,因为没有基本的资源,这有点违背我一直都告诉流("如有疑问,请使用使用 ") .

这是真的?为什么MSDN示例使用一个(总结如下)?

using(MemoryStream memStream = new MemoryStream(100))
{
            // do stuff
}
Run Code Online (Sandbox Code Playgroud)

jas*_*son 26

C#成语是如果一个对象实现,IDisposable那么你使用一个using块.这将允许正确处理对象使用的所有资源.你不应该知道实现细节MemoryStream.你知道的是它实现了IDisposable所以你应该妥善处理它.此外,您认为您现在知道它不需要释放任何资源,但您如何知道将来MemoryStream不会更改其底层实现,以便它确实使用需要释放的资源Dispose?你没有,所以既然它实现了IDispoable你现在只使用模式就有更多面向未来的代码.其次,如果您将来更改代码以使用Stream具有托管资源的其他类型,该怎么办?通过包装MemoryStream在一个using块,现在你减少日后的维护问题; 再次,这是使用对象的正确方法,特别Stream是实现的方法IDisposable.第三,它是一种向读者发出信号的明确方式,即您已经完成了使用该对象; 这是您的代码的读者在看到您正在使用实现的对象时期望看到的内容IDisposable.最后,这是当前的实施MemoryStream.Dispose:

protected override void Dispose(bool disposing) {
    try {
        if (disposing) {
            this._isOpen = false;
            this._writable = false;
            this._expandable = false;
        }
     }
     finally {
         base.Dispose(disposing);
     }
}
Run Code Online (Sandbox Code Playgroud)

因此,这标志着流是封闭的,不可写的,不可增长的.如果其他人得到了同样的参考MemoryStream,它现在变得无法使用,这可能是一件好事.但这确实是最不重要的问题; 实施细节无关紧要.

使用using块因为MemoryStream实现IDispoable.不要使用using块,因为您认为MemoryStream没有任何需要释放的资源.

  • 我同意这一点,所以投票了,但也提到请只包装使用您"拥有"的块,因为你派生或在using语句所使用的方法中创建了流,没有什么比处理三个更糟糕的了层层叠叠,因为最终有人会尝试从已经封闭的流中读取更高的值. (6认同)

Cha*_*lie 6

一个准则是,如果它实现IDisposable,那么你应该处置它.您只是使用API​​并且不了解实现,因此您没有理由不将其放入使用块中.


Mic*_*urr 5

如果该类实现了 IDisposable,则应将其释放。

你不需要费心去猜测它是否做了任何重要的事情——这是由班级来决定和实现的。如果该类在对象被处置时不执行任何操作,那么实际上就没有任何成本,因此也没有什么坏处。

封装是面向对象开发的基石之一。为什么要不遗余力地打破这一点,尤其是在没有充分理由的情况下?


Rob*_*ine 5

有过快速浏览一下在反射器,似乎DisposeMemoryStream做,只不过是标记流不公开,可写或可扩展.

话虽如此,作为一般方法,你应该保持处置模式; 特别是因为Stream所有都遵循"装饰"的方法,应该很容易互换,或用另一个包装.今天MemoryStream可能会换掉另一个明天关心的流.