web-dev-qa-db-ja.com

C#の条件ブロックの後にセミコロンは何をしますか?

私は最近プロジェクトでこのコードに出会いました-私は間違ってそこにいたと思います:

if(condition)
{
   //Whatever...
};

右中括弧の後のセミコロンに注意してください。

誰がこれの効果を知っていますか?

私はそれが何の効果も持たないと思いますが、それがコンパイラエラーを引き起こしたと思っていたでしょう。

31
Alex

これは単純な質問と単純な回答ですが、関連するものを追加したかっただけです。多くの場合、人々はそれが何もしないことを理解しています。特にあなたが提示した場合、セミコロンは不要な行終端です。

しかし、その背後にある理論的根拠は何ですか?

実際、これらの空のステートメントは次のようなステートメントで許可されます。

 // Use an empty statement as the body of the while-loop.
while (Method())
        ;

何もしないことに同意します。しかし、特定のループが言語の構文要件に準拠するのに役立ちます。これは、人々がそれから理解すべきものだと思います。他の人が言ったように、私はあなたがそれを削除できることに同意します、私はちょうどC#がそれを許可する理由を強調したかったです。

さらなる説明

空のステートメントは、ステートメントが必要な場所で操作を実行する必要がない場合に使用されます。単に制御をステートメントのエンドポイントに移します。まったく効果がなく、純粋な構文糖です。

@PaulFで述べたように、上記の例では、could空のブロック({})代わりに。それは完全に有効であり、同じ効果があります。

繰り返しますが、それはすべてスタイルに帰着します。必要ありませんが、コーディング環境のルールに準拠するのに役立ちます。

一般的なユースケース(空のステートメントを見ることができる場合)

  • 空のボディを持つループ中(上に下線を引いた同じケース)

    void ProcessMessages()
    {
        while (ProcessMessage())
            ; // Statement needed here.
    }
    
  • gotoステートメント(めったに使用しないがまだ有効)

    void F()
    {
        //...
        if (done) goto exit;
    //...
    exit:
        ; // Statement needed here.
    }
    

    [〜#〜] msdn [〜#〜] から

  • クラス宣言(これをもたらすために@EricLippertに小道具)

    class SomeClass
    {
        ...
    };
    

この場合、コメントセクションの@EricLippertで述べられているように、これはクラスの後に準決勝を入力することに慣れているC++プログラマーへの好意によるものです。 C++ではこれが必要です

空のステートメントの一般的な使用は、主にそれらがもたらす混乱のために議論の余地がありますが、私の意見では、構文的に言えば、それらはC#での位置を持っています。 C#がC++のincrementであることを忘れてはなりません(ほとんどが# aka。 2 x 2のグリッドに4つの「+」記号があり、歴史的な理由から、空のステートメントを許可することで移行が容易になりました。

33
scharette

効果がないようですが、そのようにコードを書くことはお勧めしません。

else ifの後にelseまたは;を追加したい場合、コンパイルされません。

例:

if(5>1) {
  //whatever
}; else {
  //whatever
}

これはコンパイルされません(elseの前の;に注意してください)

18

それは単なるステートメントの終了であるため、Visual Studioは空のステートメントの有効な構文としてコンパイルします。コードがコンパイルされ、余分な;は問題になりません。

必要に応じて削除してコードをクリーンアップできますが、残しても悪影響はありません。

お役に立てれば。

8
Fuzzybear