プログラムが実行するアクションはステートメントで表されます。 一般的なアクションには、特定の条件に応じて、変数の宣言、値の割り当て、メソッドの呼び出し、コレクションのループ、1 つまたは別のコード ブロックへの分岐が含まれます。 プログラムでステートメントが実行される順序は、制御フローまたは実行フローと呼ばれます。 制御のフローは、実行時に受け取る入力に対するプログラムの反応によって、プログラムが実行されるたびに異なる場合があります。
ステートメントは、セミコロンで終わる 1 行のコード、またはブロック内の一連の単一行ステートメントで構成できます。 ステートメント ブロックは {} 角かっこで囲まれており、入れ子になったブロックを含めることができます。 次のコードは、単一行ステートメントと複数行ステートメント ブロックの 2 つの例を示しています。
public 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 #{counter} is {radius}. Circumference = {circumference:N2}");
// 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 式に制御が到達すると、コントロールは呼び出し元に戻り、待機中のタスクが完了するまでメソッドの進行状況が中断されます。 タスクが完了すると、メソッドで実行を再開できます。簡単な例については、「メソッド」の「非同期メソッド」セクション を参照してください。 詳細については、「 async および await を使用した非同期プログラミング」を参照してください。 |
yield return ステートメント |
反復子は、リストや配列など、コレクションに対するカスタム イテレーションを実行します。 反復子は、 yield return ステートメントを使用して、各要素を 1 回に1 つ返します。
yield return ステートメントに達すると、コード内の現在の場所が記憶されます。 反復子が次回呼び出されると、その場所から実行が再開されます。詳細については、「 反復子」を参照してください。 |
fixed ステートメント |
固定ステートメントを使用すると、ガベージ コレクターが移動可能な変数を再配置できなくなります。 詳細については、修正済みを参照してください。 |
lock ステートメント |
lock ステートメントを使用すると、コード ブロックへのアクセスを一度に 1 つのスレッドのみに制限できます。 詳細については、 ロックを参照してください。 |
ラベル付きステートメント | ステートメントにラベルを付け、 goto キーワードを使用してラベル付きステートメントにジャンプできます。 (次の行の例を参照してください)。 |
空のステートメント | 空のステートメントは、1 つのセミコロンで構成されます。 これは何も実行せず、ステートメントが必要な場所で使用できますが、アクションを実行する必要はありません。 |
宣言ステートメント
次のコードは、初期代入の有無に関係なく変数宣言の例と、必要な初期化を使用した定数宣言の例を示しています。
// Variable declaration statements.
double area;
double radius = 2;
// Constant declaration statement.
const double pi = 3.14159;
式ステートメント
次のコードは、代入、代入を使用したオブジェクトの作成、メソッド呼び出しなど、式ステートメントの例を示しています。
// Expression statement (assignment).
area = 3.14 * (radius * radius);
// Expression statement (result discarded).
int x = 0;
x++;
// Expression statement (method invocation).
System.Console.WriteLine();
// Expression statement (new object creation).
System.Collections.Generic.List<string> strings =
new System.Collections.Generic.List<string>();
空のステートメント
次の例は、空のステートメントの 2 つの用途を示しています。
void ProcessMessages()
{
while (ProcessMessage())
; // Statement needed here.
}
void F()
{
//...
if (done) goto exit;
//...
exit:
; // Statement needed here.
}
埋め込みステートメント
繰り返しステートメントなど、一部のステートメントには、その後に埋め込まれたステートメントが常に含まれます。 この埋め込みステートメントは、1 つのステートメントでも、ステートメント ブロック内の {} 角かっこで囲まれた複数のステートメントでもかまいません。 次の例に示すように、単一行の埋め込みステートメントでも、 {} 角かっこで囲むことができます。
// 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# 言語仕様の「ステートメント」セクションを参照してください。
こちらも参照ください
.NET