二重;;
が許可されることは、歴史的な理由によるものです。それは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#に保管されたのですが、ほとんど考えられません。
;
は、コードの解析を開始する前に複数のコンパイラが省略されているため、到達不能な;
はコンパイラによって無視されます。
なぜ、それは完全に到達可能で、ただ空です – Dyppl
@Stook:無条件リターンステートメントの後にどのように到達できますか?他のステートメント(変数宣言など)を入れてみてください。コンパイラは警告を出します。 –
ああ申し訳ありませんが、私は実際の例に十分な注意を払っていませんでした。 – Dyppl