5

これ以上の情報や固有名が見つからないような面白いものに出くわしました。

私たちのほとんどは、複数のusingブロックがある場合は、最後の後に角かっこを含めるだけでよいことを知っていると思いusingます。

using (FileStream fileStream = new FileStream(zipFilePath, FileMode.Open))
using (ZipInputStream zipStream = new ZipInputStream(fileStream))
{
    //stuff
}

ただし、次のコードも機能することがわかりました。直後に角かっこを付けなくても、 :usingをピギーバックします。while

using (BinaryWriter br = new BinaryWriter(context.Response.OutputStream))
while (true)
{
    //stuff
}

コードブロックのマージを可能にするこの言語の「機能」の名前を知っている人はいますか?

4

7 に答える 7

7

はい、これは意図したものです。C♯がCやC++から受け継いだイディオムです。中かっこで囲まれた単一のステートメントがある場合、中かっこは通常オプションです。それらを使用するかどうかは、主にスタイルと読みやすさの問題です。ネストされたusingステートメントの場合、外側のレイヤーのブレースを省略するのが一般的です。

言語文法

文法的には、usingブロックの後にステートメントが続きます。通常、これはブロック ステートメントですが、そうである必要はありません。

いろいろな発表があります。のような式文がありますa = b;。のような反復文がありますwhile (boolean-expression) { ... }。ここでは、ループ全体whileが 1 つのステートメントとしてカウントされます。また、中かっこで囲まれた1 つまたは複数のステートメントで構成されるブロック ステートメントがあります。

ステートメントの正式な仕様については、C# 言語仕様、付録 C. 文法、§C.2.5 ステートメント参照してください。

ステートメント:
    ラベル付けされたステートメント
    宣言ステートメント
    埋め込みステートメント埋め込み     ステートメント
:
    ブロック
    空 の     ステートメント
    式     ステートメント
    選択     ステートメント
    反復     ステートメント
    ジャンプ






    
{ ステートメントリストオプト }

通常、ステートメントが 1 つだけの場合、ステートメントを囲む中括弧は省略できます。これらは同等です:

if (condition) statement;
if (condition) { statement; }

これらは次のとおりです。

using (...)
using (...)
    statement;

using (...)
using (...)
{
    statement;
}

using (...)
{
    using (...)
    {
        statement;
    }
}

時々必要

中括弧が必要な例外があります。メソッド本体には常に中かっこが必要です。それは文法に焼き付けられています。

メソッド本体:
    ブロック
    
;

同様に、try/ catch/finally句には中括弧が必要です。checkedと についても同じですunchecked。これは文法を見ればわかります。catch 句は、「catchステートメント」ではなく「catchブロック」として定義されます。

try-statement:
    
try block catch-clauses
    
try block finally-clause
    
try block catch-clauses finally-clause
specific-catch-clause:
    
class-type identifier opt block general-catch-clause: block finally-clause: block checked-statement: block unchecked-ステートメント: ブロック catch ( )

    
catch

    
finally

    
checked

    
unchecked

どうしてこれなの?簡単な答えは、文法のあいまいさを排除することです。詳細な説明については、この不一致に関する Eric Lippert の説明を参照してください。

于 2012-12-18T19:05:31.837 に答える
3

{ }単一のコード ブロックを作成します。それらがない場合は、次のステートメントが実行されるブロックになります。usingそのため、が に適用されるため、あなたがしていることは理にかなっていますwhile

于 2012-12-18T18:59:56.393 に答える
2

Eric Lippert が説明しているように、if/ else/ for/ while/ using/ foreach/ do/ case/ switch/ などの式がある場合は常に、その後ろに 1 つのステートメントが続きます。中括弧 ( { }) を使用することは、これらの中括弧内のすべてを 1 つのステートメントにする方法にすぎません。自然にステートメントが 1 つしかない場合はいつでも、中かっこを使用する必要はほとんどありません (可読性の可能性を除けば)。さて、ほとんどの場合、読みやすさは十分な理由ですが、コンパイラの観点からは、有効なステートメントを期待しているだけです。

于 2012-12-18T19:05:34.657 に答える
1

動作は中かっこ演算子の動作です。他の用途の中でも、可変スコープを作成します。これらは省略可能で、コード ブロックは単純に次の行です。

for(int i = 0; i < 10; i++)
  foreach(blah in y)
    dosomething();

これは、多くの C ライクな言語の特徴です。

于 2012-12-18T19:00:52.943 に答える
1

Using の後にステートメントが続き、ブロックはステートメントです。したがって、通常は使用後にブロックがありますが、例では while ですが、while の後にブロックが続く単一のステートメントを使用できます。

珍しいことは何もありません。

于 2012-12-18T19:01:42.717 に答える
1

この「概念」は、次のことを可能にするものと同じ原則であるように私には思えます。

if(somethingTrue)
    when(somethingTrue)
       if(somethingTrue)
           // some code to be executed

つまり、括弧内の複数行ではなく、単一行の「ブロック」です。

于 2012-12-18T19:03:13.120 に答える
1

最後の使用の後にのみ括弧を含める必要があります

最後に を使用する必要はありません{ }。あなたの例は、複合ブロックを使用して、または使用せずにステートメントをネストする、より一般的な機能の特殊なケースにすぎません{ }

于 2012-12-18T19:05:03.143 に答える