Stream.Dispose总是调用Stream.Close(和Stream.Flush)

Jas*_*ver 62 .net c# using

如果我有以下情况:

StreamWriter MySW = null;
try
{
   Stream MyStream = new FileStream("asdf.txt");
   MySW = new StreamWriter(MyStream);
   MySW.Write("blah");
}
finally
{
   if (MySW != null)
   {
      MySW.Flush();
      MySW.Close();
      MySW.Dispose();
   }
}
Run Code Online (Sandbox Code Playgroud)

MySW.Dispose()即使提供了,我可以打电话并跳过关闭吗?是否存在任何不能按预期工作的Stream implament(如CryptoStream)?

如果没有,那么以下只是错误的代码:

using (StreamWriter MySW = new StreamWriter(MyStream))
{
   MySW.Write("Blah");
}
Run Code Online (Sandbox Code Playgroud)

Bin*_*ier 81

我可以调用MySW.Dispose()并跳过关闭即使提供了吗?

是的,这就是它的用途.

是否有任何Stream实现无法按预期工作(如CryptoStream)?

可以安全地假设,如果一个对象实现IDisposable,它将正确处置自己.

如果没有,那就是一个bug.

如果没有,那么以下只是错误的代码:

不,该代码是处理实现对象的推荐方法IDisposable.

更好的信息在接受和关闭的答案中- 可以打电话给谁?


And*_*are 58

我使用了Reflector,发现它System.IO.Stream.Dispose看起来像这样:

public void Dispose()
{
    this.Close();
}
Run Code Online (Sandbox Code Playgroud)


Sco*_*ttS 21

正如丹尼尔布鲁克纳所提到的,Dispose和Close实际上是一回事.

但是当Stream处理/关闭时,Stream不会调用Flush().FileStream(我假设任何其他具有缓存机制的Stream)在处理时调用Flush().

如果要扩展Stream或MemoryStream等,则需要在处理/关闭时实现对Flush()的调用.

  • 我最近正在研究这个问题,如果你正在扩展MemoryStream,你可能不需要担心潮红.查看Flush for MemoryStream的实现表明它实际上是一个无操作,实际上文档声明"Overrides Flush以便不执行任何操作.". (2认同)