ステートメント (C# プログラミング ガイド)
プログラムが実行する処理は、ステートメントとして表されます。一般的な処理には、変数の宣言、値の代入、メソッドの呼び出し、コレクションに対するループ処理、条件に応じたコード ブロックへの分岐などがあります。プログラム内でステートメントが実行される順序は、制御フローまたは実行フローと呼ばれます。制御フローは、実行時に渡された入力に対するプログラムの応答に応じて、プログラムを実行するたびに変わる可能性があります。
ステートメントは、セミコロンで終わる単一行のコードか、1 つのブロックを形成する一連の単一行ステートメントで構成されます。ステートメント ブロックは中かっこ {} で囲み、入れ子になったブロックを含めることができます。次のコードは、2 つの単一行ステートメントの例と、1 つの複数行ステートメント ブロックを示しています。
static void Main()
{
// Declaration statement.
int counter;
// Assignment statement.
counter = 1;
// Error! This is an expression, not an expression statement.
// counter + 1;
// Declaration statements with initializers are functionally
// equivalent to declaration statement followed by assignment statement:
int[] radii = { 15, 32, 108, 74, 9 }; // Declare and initialize an array.
const double pi = 3.14159; // Declare and initialize constant.
// foreach statement block that contains multiple statements.
foreach (int radius in radii)
{
// Declaration statement with initializer.
double circumference = pi * (2 * radius);
// Expression statement (method invocation). A single-line
// statement can span multiple text lines because line breaks
// are treated as white space, which is ignored by the compiler.
System.Console.WriteLine("Radius of circle #{0} is {1}. Circumference = {2:N2}",
counter, radius, circumference);
// Expression statement (postfix increment).
counter++;
} // End of foreach statement block
} // End of Main method body.
} // End of SimpleStatements class.
/*
Output:
Radius of circle #1 = 15. Circumference = 94.25
Radius of circle #2 = 32. Circumference = 201.06
Radius of circle #3 = 108. Circumference = 678.58
Radius of circle #4 = 74. Circumference = 464.96
Radius of circle #5 = 9. Circumference = 56.55
*/
ステートメントの種類
次の表は、C# のさまざまな種類のステートメントと、それぞれに関連付けられているキーワードの一覧です。詳細が記載されているトピックへのリンクも示しています。
カテゴリ |
C# のキーワード/メモ |
---|---|
宣言ステートメント |
宣言ステートメントは、新しい変数または定数を定義します。変数宣言では、必要に応じて変数に値を代入することもできます。定数宣言では、常に代入が必要です。 |
式ステートメント |
値を計算する式ステートメントでは、値を変数に格納する必要があります。
|
選択ステートメントを使用すると、指定した 1 つ以上の条件に基づいて、異なるコード セクションに分岐できます。詳細については、次のトピックを参照してください。 |
|
繰り返しステートメントを使用すると、配列などのコレクションをループ処理したり、指定した条件が満たされるまで同じステートメントのセットを繰り返し実行したりできます。詳細については、次のトピックを参照してください。 |
|
ジャンプ ステートメントは、別のコード セクションに制御を移します。詳細については、次のトピックを参照してください。 |
|
例外処理ステートメントを使用すると、実行時に発生する例外状態から適切に回復できます。詳細については、次のトピックを参照してください。 |
|
checked ステートメントと unchecked ステートメントを使用すると、結果の値を保持するには小さすぎる変数に結果が格納される場合に、数値演算でオーバーフローが発生するのを許可するかどうかを指定できます。詳細については、「checked」および「unchecked」を参照してください。 |
|
await ステートメント |
async 修飾子のメソッドにマークを付ける場合、メソッドで [await] の演算子を使用できます。コントロールが非同期のメソッドの await の式に到達すると、コントロールは呼び出し元に戻り、予期されるタスクが完了するまでメソッドの進行状況は中断されます。タスクが完了すると、実行には、メソッドで再開できます。 簡単な例については、メソッド (C# プログラミング ガイド)のメソッド「Async」を参照してください。詳細については、「Async および Await を使用した非同期プログラミング (C# および Visual Basic)」を参照してください。 |
yield return ステートメント |
反復子は、リストや配列などのコレクションに対するカスタムのイテレーションを実行します。反復子は、要素を一つずつ返すために yieldを返します。 のステートメントを使用します。yield return のステートメントに到達すると、コードの現在の位置が保持されます。実装は、その場所から反復子は、次に呼び出されると再起動されます。 詳細については、「反復子 (C# および Visual Basic)」を参照してください。 |
fixed ステートメント |
fixed ステートメントは、移動可能な変数がガベージ コレクターにより再配置されることを防ぎます。詳細については、「fixed」を参照してください。 |
lock ステートメント |
lock ステートメントを使用すると、一度に 1 つのスレッドしかコード ブロックにアクセスしないように制限できます。詳細については、「lock」を参照してください。 |
ラベル付きステートメント |
ステートメントにラベルを付与し、goto キーワードを使用して、そのラベル付きステートメントにジャンプできます。次の行の例を参照してください。 |
空のステートメント |
空のステートメントは、単一のセミコロンから成ります。このステートメントは何も実行しませんが、ステートメントが必要な場所で、どのような処理も実行する必要がない場合に使用できます。空のステートメントの 2 つの使用例を次に示します。 |
埋め込みステートメント
do、while、for、foreach などの一部のステートメントでは、その後に必ず埋め込みステートメントが続きます。埋め込みステートメントは、単一のステートメントか、または複数のステートメントを中かっこ {} で囲んだステートメント ブロックです。単一行の埋め込みステートメントでも、次の例に示すように中かっこ {} で囲むことができます。
// Recommended style. Embedded statement in block.
foreach (string s in System.IO.Directory.GetDirectories(
System.Environment.CurrentDirectory))
{
System.Console.WriteLine(s);
}
// Not recommended.
foreach (string s in System.IO.Directory.GetDirectories(
System.Environment.CurrentDirectory))
System.Console.WriteLine(s);
中かっこ {} で囲まれていない埋め込みステートメントは、宣言ステートメントやラベル付きステートメントにはできません。これを次の例に示します。
if(pointB == true)
//Error CS1023:
int radius = 5;
エラーを修正するには、埋め込みステートメントをブロックに格納します。
if (b == true)
{
// OK:
System.DateTime d = System.DateTime.Now;
System.Console.WriteLine(d.ToLongDateString());
}
入れ子になったステートメント ブロック
次のコードに示すように、ステートメント ブロックは入れ子にすることができます。
foreach (string s in System.IO.Directory.GetDirectories(
System.Environment.CurrentDirectory))
{
if (s.StartsWith("CSharp"))
{
if (s.EndsWith("TempFolder"))
{
return s;
}
}
}
return "Not found.";
到達できないステートメント
コンパイラは、どのような状況でも特定のステートメントに制御フローが到達できないことを検出すると、警告 CS0162 を生成します。
// An over-simplified example of unreachable code.
const int val = 5;
if (val < 4)
{
System.Console.WriteLine("I'll never write anything."); //CS0162
}
関連項目
C# 言語仕様
詳細については、「C# 言語仕様」を参照してください。言語仕様は、C# の構文と使用法に関する信頼性のある情報源です。