1. ホーム
  2. c#

[解決済み] MemoryStream.Close()またはMemoryStream.Dispose()

2023-08-09 14:18:40

質問

どちらを呼べばいいのでしょうか?

両方を呼び出す必要があるのでしょうか。

どちらかをすでに呼び出した場合、もう一方は例外を投げるのでしょうか?

どのように解決するのですか?

Close() そして Dispose() で呼び出された場合 MemoryStream で呼び出された場合、2つのことをするためだけに機能します。

  • オブジェクトの将来の偶発的な使用で例外が発生するように、オブジェクトに破棄のマークを付けます。
  • 可能性として 1 は管理されたオブジェクトへの参照を解放し、GCの実装によってはGCの仕事を少し簡単にすることができます。 (今日の GC アルゴリズムでは実際の違いはないので、これは学術的な議論のためのポイントであり、実世界に大きな影響を与えません)。

MemoryStream はディスポーザブルなアンマネージドリソースを持っていないので、技術的にはディスポーザブルにする必要はありません。 をディスポーザブルにしないことの効果は MemoryStream への参照を削除するのとほぼ同じことです。 byte[] -- への参照を削除するのとほぼ同じことであり、GCはどちらも同じようにクリーンアップします。

どちらを呼び出せばいいのでしょうか? 両方を呼び出す必要があるのでしょうか?

その Dispose() ストリームのメソッド に直接委ねる。 Close() メソッドに直接委譲します。 2 というように、どちらも全く同じことをします。

すでにどちらかを呼び出していた場合、もう一方は例外を投げるのでしょうか?

このような場合 のドキュメントは IDisposable.Dispose() を呼び出しても安全であると明記しています。 Dispose() を複数回、任意のオブジェクトに対して 3 . (もし特定のクラスでそうでない場合は、そのクラスは IDisposable インターフェースを実装していることになり、これはバグとなります)。

を破棄するかどうかは大きな違いではありません。 MemoryStream を捨てようと捨てまいと、大きな違いはありません。 それが持つ唯一の本当の理由は Close / Dispose メソッドを継承しているためです。 Stream をサポートするストリームの契約の一部として、これらのメソッドを要求しているからです。 を行う は、管理されていないリソース(ファイルやソケットディスクリプタなど)を持つストリームをサポートするために、これらのメソッドを契約の一部として要求しています。


1 Monoの実装 を解放しません。 byte[] の参照を解放しません。 Microsoft の実装がそうであるかどうかはわかりません。

2 "このメソッドはCloseを呼び出し、次にStream.Dispose(Boolean)."を呼び出します。

3 "オブジェクトのDisposeメソッドが複数回呼び出された場合、オブジェクトは最初の1回以降のすべての呼び出しを無視しなければなりません"。