2011-01-25 6 views
13

私はステートメントを作成してコンパイルしていますが、コンパイラ[VS]はセミコロンを2回置くことはありません。C#はダブルセミコロンを許可しますか? ;もしそうなら、特別な方法はありますか?

はこのASP.NET MVC 3

return Json(mydata);; 

return Json(mydata); 

コンパイルし、それらの両方を意味するが、最初はデザインパターンで間違っています。なぜそれが私に2つのセミコロンについて教えてくれないのですか?

2つのセミコロンを使用する理由がない場合は、エラーが表示されないのはなぜですか?

特別な使用がある場合は、C#でステートメントを書くのに2つのセミコロンが必要な場所を教えてください。

答えて

19

いいえ、セミコロンは二重ではありません。私はコンパイラが到達不能なステートメントであると不平を言っていないことに少し驚いているが、明らかにそれは合法だ。それはどんな害もしませんが、同様にそれは良い考えではありません。

+2

なぜ、それは完全に到達可能で、ただ空です – Dyppl

+1

@Stook:無条件リターンステートメントの後にどのように到達できますか?他のステートメント(変数宣言など)を入れてみてください。コンパイラは警告を出します。 –

+0

ああ申し訳ありませんが、私は実際の例に十分な注意を払っていませんでした。 – Dyppl

1

現時点では、ダブルセミコロンを書く特別な理由は私の心にはありません。私の知る限りは、Visual Studioを知っているだけで次のコードのような不要な動作を引き起こす可能性がセミコロン、文句を言う:セミコロンは空の指示、無駄にレンダリングされる場合、句全体で

if (true) 
    ; 

通り。 Visual Studioは、そのような構成要素(for、for、foreachなど)の周囲に角かっこを付けずにすべての構文について不平を言います。

だから、次のコードでは、VSの罰金です:

if (true) 
{ 
     ; 
} 
2

。 - 文の区切り。ダブルセミコロンは、何もしないempty statementを含んでいます。空のステートメントの使用

:あなたが見ることができるように

while (Method()) 
    ; 

それとも

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

は、この動作は正しいです。しかし、あなたの例では、空のステートメントで到達できないコードがあります。

6

空文は、すべてのC派生言語で有効です。最も一般的な慣用的な使用は、for文、例えばである:

上記の例で
for (; ;) 
{ 
} 

if their is a special use of it then show me where two semicolon is required to write a statement in c#

、2つのセミコロンは、もちろん必要です。

+0

なぜ使用しないのですか? while(true)ループの代わりに? –

4

二重;;が許可されることは、歴史的な理由によるものです。それはCスタイルの言語(C#が基づいている)から二日酔いです。

C & C++には、コードがコンパイルされる前にコード内で置換されるプリプロセッサマクロの概念があります。簡単な例AddAndSquareは、マクロではなく、機能

#define AddAndSquare(X,Y) (X+Y)*(X+Y) 
int Foo() { 
    int a = 1, b = 2; 
    return AddAndSquare(a, b); 
} 

は、あなたが「彼らはドンので、また、あなたがそれらを再定義することができ、彼らの初期定義に異なるようにマクロを再定義することができ

int Foo() { 
    int a = 1, b = 2; 
    return (A+B)*(A+B); 
} 

ようコンパイラに行きます全く存在しない。

アサーションマクロ#define ASSERT(c) if(!c) throw new AssertionFailedException() を指定すると、コード化されたコードをASSERT文で囲むことができます。

void Foo(int x) { 
    int y = x + 2; 
    ASSERT(y != 0); 
    int z = x/y; 
    . . . . 
} 

は今、あなたは唯一のデバッグビルドでアサートしたいと考えているが、リリースビルドではないで、リリースのためにあなたは、空(文字通り#define ASSERT)するマクロを再定義します。 fooがリリースビルド用のコンパイラに行くとき今、それはまたは(ビルド構成に応じて)が声明があってもなくてもよいので、ASSERTが、だった空の文は、今あります。この

void Foo(int x) { 
    int y = x + 2; 
    ; 
    int z = x/y; 
    . . . . 
} 

のように見え、コンパイラーは空のステートメントを処理できる必要があります。

Cマクロのようなものがない場合、なぜこのコンベンションがC#に保管されたのですが、ほとんど考えられません。

;は、コードの解析を開始する前に複数のコンパイラが省略されているため、到達不能な;はコンパイラによって無視されます。

4

「使用する理由はありません」と「使用できません」の違いがあります。なぜ言語が無駄なときにこれをやることを禁止しますか?

0

C#コンパイラは、;;if and elseの間には、以下の場合にエラーをスローします。

if (condition == true) 
       ; ; 
      else 
       ; 

コンパイラエラー:あなたが1 semicolonを削除する場合

Error CS1513 } expected and one warning "Possible mistaken empty statement" 

だから、それは完璧に動作します(または、あなたがブレースを追加する必要があります)。

+1

'if(int。パース( "1")== 1){ \t \t \t; \t \t} \t \t;他 \t \t { \t \t \t \t \tは} '----これはあなたのコードが何であるかです。問題はやや退屈ですが、関連する 'if'のない' else'があります。 ';'はここでの任意のステートメントです。 –

関連する問題