5

これはくだらない質問のように思えるかもしれませんが、たとえそれが using ブロックにあるとしても、FileStream で Close() を呼び出す必要があると誰かが主張しているのを聞いたので、これを見ていました (そして、Close() が呼び出されているコードがあります)。ブロックの最後にある)。

Close() が Dispose() を呼び出すことを意図していることは知っていますが、これは .Net 1.1 コードであり、私の経験の大部分は 2.0 を使用しているため、さらに詳しく調べると思いました。

私が驚いたことの 1 つは、FileStream の MSDN ドキュメントには、.Net 2.0 の Dispose() と Dispose(bool) があり、.Net 1.1 の Dispose(bool) しかないことです。

これは見落としかもしれないと思ったので、Reflector を使用してアセンブリを調べました。そこにも Dispose(bool) が表示されますが、Dispose() は表示されません。

これは正しいです?もしそうなら、ここでの話は何ですか?FileStream は using ブロックで動作します。これは、私の知る限り、Dispose() のみを宣言する IDisposable を実装する必要があることを意味すると考えました。

コンパイラの魔法が起こっているのでしょうか、それとも Dispose() の非表示の実装がどこかにありませんか (おそらく、 Dispose(true) または Dispose(false) を呼び出しますか?)

最後に (しゃれは意図していません)、ブロックを使用して 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() を呼び出します。

(これはすべてReflectorを介して取得しました)

于 2009-06-02T14:21:04.000 に答える