C# StreamWriter拥有Close()和Dispose()有什么意义?
在活动的C# StreamWriter拥有Close()和Dispose()有什么意义?,c#,.net,vb.net,visual-c++,com,C#,.net,Vb.net,Visual C++,Com,在活动的StreamWriter上调用Close时,无法向流中写入更多代码(因为它已关闭)。要打开另一个流,您必须创建StreamWriter的新实例,因为没有“open”方法 我的问题是,当您在关闭流之后不能真正使用除Dispose之外的任何东西时,让Close和Dispose有什么意义 我可以理解是否有打开功能,即您可以关闭一个文件,然后使用相同的StreamWriter打开另一个文件。但是,由于只有Close,并且您不能真正使用Dispose之外的任何东西,为什么不干脆去掉Close,让D
StreamWriter
上调用Close
时,无法向流中写入更多代码(因为它已关闭)。要打开另一个流,您必须创建StreamWriter
的新实例,因为没有“open”方法
我的问题是,当您在关闭流之后不能真正使用除Dispose
之外的任何东西时,让Close
和Dispose
有什么意义
我可以理解是否有打开
功能,即您可以关闭一个文件,然后使用相同的StreamWriter
打开另一个文件。但是,由于只有Close
,并且您不能真正使用Dispose
之外的任何东西,为什么不干脆去掉Close
,让Dispose
关闭底层流作为它的第一个操作呢
我知道Dispose
来自idisposable
以及所有这些。我想知道的是,当Dispose
显示为调用Close
时,为什么特别需要Close
据我所知,如果不能使用相同的StreamWriter
打开另一个流,那么当您除了Dispose
之外别无选择时,关闭是没有意义的,因为所有其他方法都变得无用了
为什么当StreamWriter
可以将Close
和Dispose
合并到一个方法中时,StreamWriter
会费心让Close
关闭呢?根据Close
只调用Dispose
值为true
- 此方法覆盖关闭
- Close的这种实现调用
Dispose方法传递一个真值
- 你必须给Close打电话以确保
确保所有数据正确写入基础流。
在调用Close之后,StreamWriter上的任何操作都可能
提出例外情况。如果磁盘空间不足,请调用
Close将引发异常
Dispose
本身继承自,由具有需要释放的资源的类使用。打开流同时分配应用程序和系统资源。如果您的应用程序打开多个流而不关闭它们,则会限制其他应用程序访问这些文件的能力。尽快关闭溪流是很重要的
至于为什么流不能重新打开,这基本上是.NET方法。该类表示一个开放流。因此,创建一个访问流并尽快摆脱它。当您想再次访问流时,可以创建另一个流
我认为创建一个可以重新打开的流类是有效的,但它确实会导致一些问题,因为当流关闭时,许多方法都无法工作。最后,流类确实代表了一个开放流
Dispose
只是为了更方便地确保流得到及时清理。当你说“为什么不干脆扔掉…”时,你的思路是正确的,除非它是向后的。如果查看StreamWriter.Close()
的底层代码,您将看到:
public override void Close()
{
this.Dispose(true);
GC.SuppressFinalize((object) this);
}
所以Close()方法就是告诉框架您已经完成了对流的写入
为什么不放弃关闭并让dispose关闭底层流作为其第一个操作
这是很好的编程实践
假设你家里的灯在你离开时自动关闭。你离开的时候不必关灯,但这是个好习惯。这样,你就不会要求你住的每栋房子都自动关灯。你会习惯于自己关掉它们
显式调用Close()
告诉读者(和系统)“我处理完这个流”,调用Dispose()
告诉系统(和读者)“可以释放任何嵌入式资源”.在处理流时,有一个长期的惯例,即Close
是他们必须关闭流的一种方法。这是许多程序员在处理流时习惯并期望看到的术语。如果流没有Close
方法,可能会造成混乱,人们可能需要一些时间才能意识到他们应该使用Dispose
来关闭流
当然,类可能已经显式地实现了IDisposable
,因此Dispose
方法如果没有对IDisposable
的转换就不会存在,my已经消除了一些混淆,但他们选择不这样做,并在类中留下两个重复的方法
使用Dispose
或Close
来关闭流完全取决于您的个人喜好。看起来您将其向后-Close
调用Dispose
,而不是相反。Close
调用Dispose
,这将关闭基础流资源。无需同时调用这两个方法<代码>关闭
只需调用处置
。调用这两个函数只是多余的,并不是一个好的做法。我已经读过很多次了,关闭是流和读写器的一部分,这仅仅是因为“关闭”文件的约定。我记不清了,但我觉得CLR中通过C#勾勒出了这一点点信息。Close
实际上只是一个更友好的名称,来自.NET 1.0,在他们取消约定之前。自那以后,微软就表示,为了在各种API之间保持一致性,应该优先选择Dispose
,并且从那以后就没有编写过复制Close
方法的功能。回顾我过去的一些问题