どちらに電話しますか?
両方を呼び出す必要がありますか?
すでに呼び出している場合、もう一方は例外をスローしますか?
Close()
およびDispose()
は、MemoryStream
で呼び出された場合、2つのことのみを行います。
MemoryStream
には破棄する管理対象外のリソースがないため、技術的に破棄する必要はありません。 MemoryStream
を破棄しないことの効果は、_byte[]
_への参照を削除することとほぼ同じです。GCは両方を同じ方法でクリーンアップします。
どちらに電話しますか?両方を呼び出す必要がありますか?
ストリームのDispose()
メソッド Close()
メソッドに直接委任2、両方ともまったく同じことを行います。
すでに呼び出している場合、もう一方は例外をスローしますか?
IDisposable.Dispose()
のドキュメント は、任意のオブジェクトでDispose()
を複数回呼び出すことが安全であることを具体的に示しています3。 (特定のクラスに当てはまらない場合、そのクラスは契約に違反する方法でIDisposable
インターフェースを実装します。これはバグになります。)
つまり、MemoryStream
を破棄するかどうかは大きな違いにはなりません。 Close
/Dispose
メソッドを持っている唯一の本当の理由は、Stream
から継承するためです。これは、doには、管理されていないリソース(ファイルまたはソケット記述子など)があります。
1 Monoの実装 は_byte[]
_参照を解放しません。 Microsoftが実装しているかどうかはわかりません。
2 "このメソッドはCloseを呼び出し、次にStream.Dispose(Boolean)を呼び出します。"
3 "オブジェクトのDisposeメソッドが複数回呼び出された場合、オブジェクトは最初の呼び出し以降のすべての呼び出しを無視する必要があります。"
これにはusing
ブロックを使用できます。スコープ外になると、自動的にDispose
を呼び出します。
例:
using (MemoryStream ms = new MemoryStream())
{
// Do something with ms..
}
// ms is disposed here
これが役に立てば幸いです。
using
インターフェイスを実装しているオブジェクトが破棄されるように、IDisposable
ブロックを使用します
次のコードは、ご覧のようにリフレクターからのStream.Disposeです。破棄する場合、閉じる必要はありません(使用時に暗黙的です)
public void Dispose()
{
this.Close();
}
どちらに電話しますか?
それらのいずれか。
両方を呼び出す必要がありますか?
いいえ、どちらでも十分です。
すでに呼び出している場合、もう一方は例外をスローしますか?
いいえ、使い捨てのパターンは、Disposeの後続の呼び出しが悪影響を引き起こさないことを宣言しています。
Close()を呼び出すと、Dispose()が内部的に呼び出されてリソースが解放されます。
詳細については、次のリンクを参照してください。 msdn
上記のどれでもない。 Close
またはDispose
を呼び出す必要はありません。
MemoryStream
はアンマネージリソースを保持しないため、回収するリソースはメモリのみです。コードがMemoryStream
を参照しなくなった場合、ガベージコレクション中に残りのMemoryStream
オブジェクトでメモリが回収されます。
MemoryStream
への長命の参照がある場合、その参照をnullに設定して、MemoryStream
のガベージコレクションを許可できます。 Close
およびDispose
は、SteamバッファーもMemoryStream
オブジェクトも適切に解放しません。
Stream
もMemoryStream
もファイナライザーを持たないため、Close
またはDispose
を呼び出して_GC.SuppressFinalize
_を呼び出して最適化する必要はありません。ガベージコレクション。抑制するファイナライザーはありません。
MemoryStream のドキュメントでは、次のように記述しています。
このタイプは
IDisposable
インターフェースを実装しますが、実際に破棄するリソースはありません。つまり、Dispose()
を直接呼び出したり、using
(C#の場合)やUsing
(Visual Basicの場合)などの言語構造を使用して破棄する必要はありません。
Dispose()
のみを呼び出すと、トリックが実行されます=)
.NET 3.5(他のバージョンはチェックしていません)では、MemoryStreamを破棄するときにメソッドは次の順序で呼び出されます。
最初の解決策として、可能な限りusingステートメントを使用することをお勧めします。これはここで説明されています: http://msdn.Microsoft.com/en-us/library/yh598w02.aspx
IDisposableオブジェクトのライフタイムが単一のメソッドに制限されている場合、usingステートメントで宣言してインスタンス化する必要があります。 usingステートメントは、オブジェクトのDisposeメソッドを正しい方法で呼び出し、(前に示したように使用する場合)、Disposeがすぐにスコープから外れるようにしますusingブロック内では、オブジェクトは読み取り専用であり、変更または再割り当てできません。
他のほとんどの.NETフレームワーククラスで提案されているように、ここで質問に答えると、Close()とDispose()の間に違いはなく、どちらのメソッドを呼び出すかは重要ではありません。両方ではなく1つを呼び出す必要があります。ただし、には例外があります。
例外があります。たとえば、System.Windows.Forms.FormとSystem.Data.SqlClient.SqlConnectionは、Close()とDispose()で異なる動作をします。
詳細については、こちらで確認できます。 https://blogs.msdn.Microsoft.com/kimhamil/2008/03/15/the-often-non-difference-between-close-and-dispose/