Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# StreamWriter拥有Close()和Dispose()有什么意义?_C#_.net_Vb.net_Visual C++_Com - Fatal编程技术网

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
方法的功能。回顾我过去的一些问题