10

これは、5 段の深さのステートメントを使用して入れ子にしたときに、過去に何度も自問してきた質問です。

ドキュメントを読んで、ブロック内でインスタンス化された他の使い捨てアイテムに関してどちらの方法でも言及されていないことを見つけたので、SO アーカイブの良い Q であると判断しました。

このことを考慮:

using (var conn = new SqlConnection())
{
    var conn2 = new SqlConnection();
}

// is conn2 disposed?
4

7 に答える 7

15

いいえそうではありません。using 句に明示的にリストされた変数のセットのみが自動的に破棄されます。

于 2010-02-17T22:35:57.333 に答える
6

明らかに私は答えを持っています... ;-)

答えはノーだ。using 宣言内のオブジェクトのみが破棄されます

[Test]
public void TestUsing()
{
    bool innerDisposed = false;
    using (var conn = new SqlConnection())
    {
        var conn2 = new SqlConnection();
        conn2.Disposed += (sender, e) => { innerDisposed = true; };
    }

    Assert.False(innerDisposed); // not disposed
}

[Test]
public void TestUsing2()
{
    bool innerDisposed = false;
    using (SqlConnection conn = new SqlConnection(), conn2 = new SqlConnection())
    {
        conn2.Disposed += (sender, e) => { innerDisposed = true; };
    }
    Assert.True(innerDisposed); // disposed, of course
}
于 2010-02-17T22:35:48.127 に答える
4

using ステートメントの正確な規則が必要な場合は、仕様のセクション 8.13 を参照してください。あなたの質問はすべてそこで明確に答えられるべきです。

于 2010-02-17T22:41:53.217 に答える
2

いいえ、機能しませんconn2 。破棄されません。usingより柔軟にするために括弧を使用しないことを許可する唯一の状況は倍数であることに注意してください。

        using (var pen = new Pen(color, 1))
        using (var brush = new SolidBrush(color))
        using (var fontM60 = new Font("Arial", 15F, FontStyle.Bold, GraphicsUnit.Pixel))
        using (var fontM30 = new Font("Arial", 12F, FontStyle.Bold, GraphicsUnit.Pixel))
        using (var fontM15 = new Font("Arial", 12F, FontStyle.Regular, GraphicsUnit.Pixel))
        using (var fontM05 = new Font("Arial", 10F, FontStyle.Regular, GraphicsUnit.Pixel))
        using (var fontM01 = new Font("Arial", 8F, FontStyle.Regular, GraphicsUnit.Pixel))
        using (var stringFormat = new StringFormat())
        {
        }

このように、入れ子usingは大したことではありません。

于 2012-11-29T08:40:25.667 に答える
1

いいえ。 Using を使用すると、using ステートメント内のオブジェクトが破棄されます。両方のオブジェクトを破棄したい場合は、これを次のように書き換える必要があります。

using (var conn = new SqlConnection())
{
    using (var conn2 = new SqlConnection())
    {
        // use both connections here...
    }
}

または、代わりに、より簡潔な構文を使用できます。

using (SqlConnection conn = new SqlConnection(), conn2 = new SqlConnection())
{
    // use both connections here...
}
于 2010-02-17T22:37:57.043 に答える
0

いいえ。生成された IL を ILDASM または Reflector で確認してください。

于 2010-02-17T22:35:48.223 に答える
0

using()実際のコード ブロックではなく、内の変数のみが破棄されます。.

于 2010-02-17T22:37:51.070 に答える