6

重複の可能性:
C# のネストされた using ステートメント

私はusingC# のステートメントの大ファンです。私はこれを見つけます:

using (var foo = new ObjectWhichMustBeDisposed())
{
    other code
}

...これよりもはるかに読みやすい:

var foo = new ObjectiWhichMustBeDisposed();

try
{
    other code
}
finally
{
    foo.Dispose();
}

読みやすくなるだけでなく、ステートメントの後 (つまり、破棄された後) にfoo変数を誤って使用することも防止されますが、2 番目の例では、破棄された後に使用できます。usingfoo

ただし、 の1 つの問題はusing、大量の破棄可能なオブジェクトが作成されている場合、非常にネストされたコードになる傾向があることです。例えば:

using (var foo = new ObjectWhichMustBeDisposed())
{
    using (var bar = new ObjectWhichMustBeDisposed())
    {
        other code
    }
}

両方のオブジェクトが同じタイプの場合、次のusingようにそれらを 1 つのステートメントに結合できます。

using (var foo = new ObjectWhichMustBeDisposed(),
           bar = new ObjectWhichMustBeDisposed())
{
    other code
}

ただし、オブジェクトが同じタイプでない場合、これは機能しません。

私の質問は、次のような同様の目的を達成しても問題ないかどうかです。

using (var foo = new ObjectWhichMustBeDisposed())
using (var bar = new OtherObjectWhichMustBeDisposed())
{
    other code
}

この場合、最初の使用後に中括弧はありません (したがって、コードをインデントする必要はありません)。これはコンパイルされ、中かっこのないステートメントと同じように機能すると仮定します。つまり、次のステートメント (この場合は 2 番目) を「本体」として使用します。ifusing

それが正しいかどうか誰かが確認できますか?( using ステートメントの説明は役に立ちません)。

4

4 に答える 4

7

はい、あなたが提案するコード

using (var foo = new ObjectWhichMustBeDisposed())
using (var bar = new OtherObjectWhichMustBeDisposed())
{
    other code
}

OKであり、非常に一般的です。

各usingの後に追加の { } を使用する必要はありません(他のコードが複数のステートメントである場合は、他のコードを含むものを除く)。

using (var foo = new ObjectWhichMustBeDisposed())
using (var bar = new OtherObjectWhichMustBeDisposed())
using (var baz = new OtherObjectWhichMustBeDisposed())
using (var quux = new OtherObjectWhichMustBeDisposed())
{
    other code
}

もいいでしょう。

于 2013-01-31T16:48:41.617 に答える
2

usingC# 標準のステートメント定義を見てください。

12.3.3.17 using ステートメント
using ステートメント stmt の形式:
using ( resource-acquisition ) embedded-statement

embedded-statementは次のいずれかです (項目 A2.5 を参照)。

埋め込みステートメント : ブロック

の ステートメント
式 ステートメント
選択 ステートメント
繰り返し ステートメント
ジャンプ ステートメント





したがって、using(ブロックまたは別の using ステートメント) の両方の使用法は、C# 標準の観点からは完全に同等です。

于 2013-01-31T17:07:10.113 に答える
1

はい、正しいです。ただし、それは適切なコーディング スタイルではない可能性があります。

SO については、これに関して長い議論がありました投稿では、OP は using ステートメントについて具体的に言及しています。読む価値があるかもしれません。

于 2013-01-31T16:53:56.710 に答える
1

はい、これは正しいです。

using (var foo = new ObjectWhichMustBeDisposed())
using (var bar = new OtherObjectWhichMustBeDisposed())
{
    other code
}

残りはあなた次第です。このコーディング方法が気に入った場合は、それを使用してください。

于 2013-01-31T16:48:49.563 に答える