6

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

我的问题是,除了关闭流之外Close,什么Dispose时候你不能真正使用任何东西有什么意义?Dispose

我可以理解是否有一个Open功能,即您可以关闭一个文件,然后使用相同的StreamWriter. 但是因为只有Close并且除了之后你不能真正使用任何东西Dispose,为什么不干脆摆脱CloseDispose关闭底层流作为它的第一个动作呢?

我知道这Dispose来自于IDisposeable所有这些。我想知道的是为什么无论如何Close都需要特别需要DisposeClose

据我所见,如果无法使用相同的方法打开另一个流,那么当您别无选择时,StreamWriter没有任何意义,因为所有其他方法都变得无用。CloseDispose

为什么当它们可以合并成一个方法时StreamWriter会有麻烦呢?CloseCloseDispose

4

5 回答 5

2

在处理流时,有一个长期存在的约定,Close即他们必须关闭流的方法。这是许多程序员在处理流时习惯并期望看到的术语。没有Close方法的流可能会令人困惑,并且人们可能需要一些时间才能意识到他们应该使用Dispose来关闭流。

类当然可以IDisposable显式实现,因此Dispose如果没有强制转换,该方法就不会存在IDisposable,并且我已经消除了一些混乱,但他们选择不这样做,并在其中留下两个重复的方法班上。

是否使用DisposeClose关闭流完全取决于您的个人喜好。

于 2012-12-27T17:00:06.180 回答
1

根据文档Close只需调用Dispose值为true.

  • 此方法覆盖 Close。

  • Close 的此实现调用 Dispose 方法并传递一个真值。

  • 您必须调用 Close 以确保所有数据都正确写入底层流。在调用 Close 之后,StreamWriter 上的任何操作都可能引发异常。如果磁盘空间不足,调用 Close 会引发异常。

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

于 2012-12-27T16:48:18.740 回答
0

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

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

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

Dispose只是为了更容易确保及时清理流。

于 2012-12-27T16:48:20.283 回答
0

为什么不直接摆脱 close 并将关闭底层流作为其第一个操作呢?

这是很好的编程习惯。

假设您家中的灯在您离开时会自动关闭。当你离开时你不必关灯,但这是个好习惯。这样,您就不会要求您居住的每间房屋都自动关灯。你会养成自己关闭它们的习惯。

显式调用Close()告诉读者(和系统)“我已经完成了这个流”,调用Dispose()告诉系统(和读者)“你可以释放任何嵌入的资源”。

于 2012-12-27T16:53:02.883 回答
-1

当你说“为什么不只是摆脱......”时,你走在正确的轨道上,但它是倒退的。如果您查看底层代码,StreamWriter.Close()您将看到:

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

因此,Close() 方法就是您告诉框架您已完成写入流的方式。

于 2012-12-27T16:49:49.093 回答