具有Close()和Dispose()的streamwriters有什么意义?

时间:2012-12-27 16:43:47

标签: c# .net vb.net visual-c++ com

当您在活动Close上调用StreamWriter时,无法再向流中写入任何代码(因为它已关闭)。要打开另一个流,您必须创建StreamWriter的新实例,因为没有“打开”方法。

我的问题是,在关闭流后,除Close之外的其他任何内容都无法使用DisposeDispose时有什么意义?

我可以理解是否有Open函数,即您可以关闭一个文件,然后使用相同的StreamWriter打开另一个文件。但是因为只有Close并且之后除了Dispose之外你不能真正使用任何东西,为什么不放弃Close并让Dispose关闭基础流作为其第一次行动?

我认为Dispose来自IDisposeable以及所有这些。我想知道的是,当Close似乎呼叫Dispose时,为什么需要Close

据我所知,如果无法打开具有相同StreamWriter的其他信息流,那么除了Close之外没有选择,Dispose没有任何意义因为所有其他方法都变得无用。

为什么StreamWriter在将CloseClose合并到一个方法中时会遇到Dispose

5 个答案:

答案 0 :(得分:2)

在处理流时,Close是一种他们必须关闭流的方法。它是许多程序员习惯并期望在处理流时看到的术语。如果没有Close方法的流可能会令人困惑,并且可能需要一些时间让人们意识到他们应该使用Dispose关闭流。

该类明确地实现IDisposable肯定是可能,因此如果没有强制转换为DisposeIDisposable方法就不存在,并且我已经清理了一些混乱,但他们选择不这样做,并在课堂上留下两个重复的方法。

完全取决于您的个人偏好,无论您使用Dispose还是Close来关闭该流。

答案 1 :(得分:1)

根据the documentationClose只需调用值Dispose的{​​{1}}。

  
      
  • 此方法会覆盖关闭。

  •   
  • Close的这个实现调用了   处理传递真值的方法。

  •   
  • 您必须致电关闭才能确保   所有数据都正确写出到底层流。   在调用Close之后,StreamWriter上的任何操作都可能   提出例外。如果磁盘上没有足够的空间,请致电   关闭将引发异常。

  •   

true本身继承自IDisposable,由具有需要释放资源的类使用。

答案 2 :(得分:0)

打开流分配应用程序和系统资源。如果您的应用程序在不关闭它们的情况下打开许多流,则会限制其他应用程序访问这些文件的能力。尽快关闭流是很重要的。

至于为什么流没有重新打开的能力,这基本上就是.NET方法。该类代表一个开放流。因此,创建一个访问流并尽快摆脱它。如果要再次访问流,可以创建另一个流。

我认为创建一个可以重新打开的流类是有效的,但它确实会导致一些问题,因为当流关闭时,许多方法都无法工作。最后,流类确实代表了 open 流。

Dispose可以让您更轻松地确保及时清理流。

答案 3 :(得分:0)

  

为什么不放弃关闭并将其作为第一个动作关闭底层流?

这是一个很好的编程习惯。

假设您家中有灯,当您离开时会自动关闭。当你离开时,你不会拥有来关灯,但它很好练习。这样,你就不会要求你住的每个房子都能自动关灯。你有养成自己拒之门外的习惯。

明确调用Close()告诉读者(和系统)“我已完成此流”,并且调用Dispose()告诉系统(和读者)“您可以释放任何嵌入的资源”

答案 4 :(得分:-1)

当你说“为什么不摆脱......”时,你走在正确的轨道上,除非它是向后的。如果您查看StreamWriter.Close()的基础代码,您会看到:

public override void Close()
{
  this.Dispose(true);
  GC.SuppressFinalize((object) this);
}

所以Close()方法就是告诉框架你写完流的方式。