こんにちは、私が次のものを持っているかどうかを明確にするために:
using (Object1) {
create Object2
}
// bookmark1
Object2 は Object1 と一緒にブックマーク 1 で破棄されますか? Object2 は StringReader で、Object1 は MemoryStream です。
こんにちは、私が次のものを持っているかどうかを明確にするために:
using (Object1) {
create Object2
}
// bookmark1
Object2 は Object1 と一緒にブックマーク 1 で破棄されますか? Object2 は StringReader で、Object1 は MemoryStream です。
どちらのオブジェクトもブロックの最後に破壊されません。
Object1 は、別の概念であるDisposedになります。Object2 には何も起こりません。
両方のオブジェクトが収集され、後でファイナライズされる可能性があります。ガベージ コレクションは非決定的です。いつ発生するかは当てになりません。
詳細については、MSDN のIDisposableを参照してください。
using ブロックは、次のような構造の構文糖衣です。
try
{
Brush b = new SolidBrush(Color.Red);
}
finally
{
b.Dispose();
}
そのため、アプリケーションの制御外で何かが発生しない限り、'b' は try ブロックの最後に配置されます。
この例では、ブロック (bookmark1) の最後で、オブジェクト 1 のみが破棄されます。ファイル ストリームの場合、これはストリームが閉じられ、ハンドルが解放されることを意味しますが、実際の文字列オブジェクトはメモリ内に残ります (GC によってクリーンアップされる準備ができています)。あなたの場合、 Object2 は破棄されないため、使用するハンドルは引き続き開いたままになります。最終的に、GC はそれを収集し、そのファイナライザーを呼び出します。その時点で、正しく解放されます。
両方のオブジェクトを正しく「クリーンアップ」したい場合は、using ステートメントでラップするか、Dispose を手動で呼び出すことにより、両方を破棄する必要があります。
代替の、潜在的によりクリーンな構文もあります。
using (Object1 obj1 = new Object1(), Object2 obj2 = new Object2())
{
// Do something with obj1 & obj2
}
これを行うと、obj1 と obj2 の両方がブロックの最後で Disposed されます。あなたの場合、これは両方のオブジェクトが閉じられ、それらのハンドルが解放されることを意味します。GC は、将来のガベージ コレクションでそれらをクリーンアップします。
詳細については、MSDN の使用に関するページを参照してください。
object2は object1 と一緒に破棄 (処分) されません。ただし、using ステートメント用に別のスコープ ブロックが作成されるため、object2 はこの時点でスコープ外になります。その処分は決定論的ではありません。
また、object2 も IDisposable である場合、これを行うことができます。
using (object1)
using (object2)
{
} // bookmark1
いずれにせよ、通常のガベージ コレクション ルールが適用されます。オブジェクトの管理対象リソース (メモリ) は、引き続き通常の方法で処理されます。Using/IDisposable は、管理されていないリソースのみを解放します。