7

こんにちは、私が次のものを持っているかどうかを明確にするために:

using (Object1) {
create Object2
}
// bookmark1

Object2 は Object1 と一緒にブックマーク 1 で破棄されますか? Object2 は StringReader で、Object1 は MemoryStream です。

4

4 に答える 4

20

どちらのオブジェクトもブロックの最後に破壊されません。

Object1 は、別の概念であるDisposedになります。Object2 には何も起こりません。

両方のオブジェクトが収集され、後でファイナライズされる可能性があります。ガベージ コレクションは非決定的です。いつ発生するかは当てになりません。

詳細については、MSDN のIDisposableを参照してください。

于 2009-03-17T20:31:03.280 に答える
2

using ブロックは、次のような構造の構文糖衣です。

try
{
    Brush b = new SolidBrush(Color.Red);
}
finally
{
    b.Dispose();
}

そのため、アプリケーションの制御外で何かが発生しない限り、'b' は try ブロックの最後に配置されます。

于 2009-03-17T20:35:09.747 に答える
1

この例では、ブロック (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 の使用に関するページを参照してください。

于 2009-03-17T20:49:37.557 に答える
0

object2は object1 と一緒に破棄 (処分) されません。ただし、using ステートメント用に別のスコープ ブロックが作成されるため、object2 はこの時点でスコープ外になります。その処分は決定論的ではありません。

また、object2 も IDisposable である場合、これを行うことができます。

using (object1)
using (object2)
{
} // bookmark1

いずれにせよ、通常のガベージ コレクション ルールが適用されます。オブジェクトの管理対象リソース (メモリ) は、引き続き通常の方法で処理されます。Using/IDisposable は、管理されていないリソースのみを解放します。

于 2009-03-17T20:30:15.060 に答える