8
public void Finalise()
    ProcessFinalisation(true);

コンパイルされませんが、正しいバージョン:

public void Finalise()
{
    ProcessFinalisation(true);
}

正常にコンパイルされます (もちろん)。

次のコードが 1 行しかない場合に角かっこなしで許可されている場合:

if(true)
    CallMethod();

次の行が1つあるメソッドで同じことが許可されないのはなぜですか? 技術的な理由はありますか?

4

4 に答える 4

14

明白な答えは言語仕様です。推論のために...私は主に単純さを推測します-それは正気のオーバーヘッドの価値がなかっただけです-スペックとコンパイラをチェックして、ごく少数のシングルステートメントメソッドを探します。特に、一般的な制約など(つまりwhere T : IBlah, new()、署名の最後)の問題が発生する可能性があります。

中かっこを使用しないと、あいまいさが生じることがあり、場所によっては眉をひそめることに注意してください。私は個人的にはそれよりも少し実用的ですが、それぞれ独自のものです。

かみそりの中のC#が明示的な中括弧なしでの使用を許可しないことも興味深いかもしれません。まったく(つまり、ifなどでも)。

于 2011-05-16T11:29:19.810 に答える
11

マークは基本的に正しいです。彼の答えを少し拡張すると、C#で「裸の」ステートメントを許可するのではなく、ブレース付きのステートメントブロックが必要になる場所がいくつかあります。彼らです:

  • メソッドの本体、コンストラクター、デストラクタ、プロパティアクセサー、イベントアクセサー、またはインデクサーアクセサー。
  • try、catch、finally、checked、unchecked、またはunsafe領域のブロック。
  • ステートメントラムダまたは無名メソッドのブロック
  • ブロックにローカル変数宣言が直接含まれている場合は、ifまたはloopステートメントのブロック。(つまり、 "while(x!= 10)int y = 123;"は違法です。宣言を中括弧で囲む必要があります。)

これらの各ケースでは、単一の括弧で囲まれていないステートメントが合法である機能について、明確な文法(またはあいまいな文法を明確にするヒューリスティック)を思い付くことが可能です。しかし、ポイントは何でしょうか?これらの状況のそれぞれで、複数のステートメントが表示されることを期待しています。単一のステートメントはまれであり、ありそうもないケースです。これらの非常にまれなケースで文法を明確にすることは、実際には価値がないようです。

于 2011-05-16T14:53:25.753 に答える
1

簡単な答え: C# は C の後にスタイルが設定されており、C の関数宣言がかつてどのように行われていたかにより、C では関数を波括弧で囲むことが義務付けられています。

歴史のある長いバージョン: K&R C では、関数は次のように宣言されていました。

int function(arg1, arg2)
int arg1;
int arg2;
{ code }

もちろん、その配置で unbraced 関数を使用することはできません。ANSI C では、誰もが知っていて愛用している構文が義務付けられています。

int function(int arg1, int arg2)
{ code }

しかし、K&R 構文しか知らない古いコンパイラで大混乱を引き起こすため、アンブレース関数を許可しませんでした [そして K&R 宣言のサポートがまだ必要でした]。

時が経ち、数年後、C# は C [または C++、構文の点で同じ違い] を中心に設計されました。C は波括弧なしの関数を許可しなかったため、C# もそうではありませんでした。

于 2011-11-18T03:28:35.147 に答える