通常我会在using语句中声明流,以确保在完成后正确处理流,并且当我在使用块之外时,我不会错误地调用它。
这里有一些例子: MSDN using Statement Reference
如何使用带有数组流的using语句? 它是否相当于在try / catch / finally块之外声明数组并在finally块中调用每个流的dispose方法?
最后,如何测试流已正确处理?
答案 0 :(得分:7)
我会创建一个新的对象来保存Streams。像这样的东西(没有完全充实):
class StreamHolder : IDisposable
{
List<Stream> Streams {get;}
public void Dispose()
{
Streams.ForEach(x=>x.Dispose()):
}
}
这样您可以将容器对象放在using
语句中,它将为您处理流处理。你的另一个选择是在Finally块中处理它,但如果我要在多个地方执行此操作,我想封装它,所以当我完成时我不会忘记丢弃所有的流。
答案 1 :(得分:3)
您必须执行using
所做的事情而不使用using
。
这意味着循环遍历数组并在每个实例上调用Dispose
(如果需要,在显式转换为IDisposable
之后)。在finally
块中执行该循环。
最后,您没有测试它们是否妥善处理。一旦你调用Dispose,你就应该将它们清空,因为你不能再使用它们了。
答案 2 :(得分:2)
using()语句是一种旨在重新制定良好习惯的处置模式,但并不是必需的。在很多情况下,您需要在范围函数的生命周期之外存储对象。
虽然我认为你应该以一种可以使用using()语句的方式进行架构,但重要的是在一些encopassing finally块中,你可以处理每个流。
要回答最后一个问题,Stream类似乎没有任何方法或属性来确定它是否已被关闭/处置,但是如果正确实现了IDisposable模式,则可以再次调用Close / Dispose需要确定。