5

这似乎是一个点头的问题,但我正在看这个,因为我听到有人声称你必须在 FileStream 上调用 Close(),即使它在 using 块中(并且他们有调用 Close() 的代码就在街区的尽头)。

我知道 Close() 是为了调用 Dispose(),但我想我会看得更深,因为这是 .Net 1.1 代码,而且我的大部分经验都是在 2.0 上进行的。

让我印象深刻的一件事是,FileStream 的 MSDN 文档具有适用于 .Net 2.0 的 Dispose() 和 Dispose(bool),但只有适用于 .Net 1.1 的 Dispose(bool)。

我认为这可能是一个疏忽,所以我使用 Reflector 来查看一个程序集——在那里,我也看到了 Dispose(bool),但没有看到 Dispose()。

它是否正确?如果是这样,这里的故事是什么?FileStream 在 using 块中工作——我认为这意味着它必须实现 IDisposable,据我所知,它只声明了 Dispose()。

是否发生了一些编译器魔术,或者我在某处缺少 Dispose() 的隐藏实现(大概调用 Dispose(true) 或 Dispose(false) ?)

最后(没有双关语),您能否确认在 using 块中确定 FileStream 的范围将在 .Net 1.1 的范围退出时关闭流?

[编辑]

澄清一下,这是 C# 代码。我知道 VB.Net 直到 .Net 2.0 才得到 using 语句,但我的理解是 C# 在 1.1 中有它(我的 1.1 代码有它并编译)

4

1 回答 1

9

它的实现有点滑稽,但它就在那里:FileStream 的基类:System.IO.Stream 实现了 IDisposable(FileStream 只是继承了它)。

基流类显式地实现了 Dispose(),因此只有将流转换为 IDisposeable 时才会看到 Dispose()(这是 using{} 所做的)。

Stream.Dispose() 调用 Stream.Close()。

(通过反射器得到所有这些)

于 2009-06-02T14:21:04.000 回答