当您在活动Close
上调用StreamWriter
时,无法再向流中写入任何代码(因为它已关闭)。要打开另一个流,您必须创建StreamWriter
的新实例,因为没有“打开”方法。
我的问题是,在关闭流后,除Close
之外的其他任何内容都无法使用Dispose
和Dispose
时有什么意义?
我可以理解是否有Open
函数,即您可以关闭一个文件,然后使用相同的StreamWriter
打开另一个文件。但是因为只有Close
并且之后除了Dispose
之外你不能真正使用任何东西,为什么不放弃Close
并让Dispose
关闭基础流作为其第一次行动?
我认为Dispose
来自IDisposeable
以及所有这些。我想知道的是,当Close
似乎呼叫Dispose
时,为什么需要Close
。
据我所知,如果无法打开具有相同StreamWriter
的其他信息流,那么除了Close
之外没有选择,Dispose
没有任何意义因为所有其他方法都变得无用。
为什么StreamWriter
在将Close
和Close
合并到一个方法中时会遇到Dispose
?
答案 0 :(得分:2)
在处理流时,Close
是一种他们必须关闭流的方法。它是许多程序员习惯并期望在处理流时看到的术语。如果没有Close
方法的流可能会令人困惑,并且可能需要一些时间让人们意识到他们应该使用Dispose
关闭流。
该类明确地实现IDisposable
肯定是可能,因此如果没有强制转换为Dispose
,IDisposable
方法就不存在,并且我已经清理了一些混乱,但他们选择不这样做,并在课堂上留下两个重复的方法。
完全取决于您的个人偏好,无论您使用Dispose
还是Close
来关闭该流。
答案 1 :(得分:1)
根据the documentation,Close
只需调用值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()方法就是告诉框架你写完流的方式。