.NET Visual C#言語入門 > ステートメント(文)
のぶ亭『プログラミングの相談窓口』 … 様々なプログラミング問題を個別対応致します |
ステートメント(文)
プログラムにとって、ステートメント(文)は重要です。特に●印の項目は、無意識に使えるぐらいになって下さい。決して難しいものではありませんし、日本語での表現もあわせて理解し、手順やシナリオを考える際にも使用するようにして下さい。
INDEX
- 選択ステートメント
- 繰り返しステートメント
- ジャンプステートメント
- 例外処理ステートメント
- CheckedとUncheckedステートメント
- Checked (算術オーバーフロー例外発生)
- Unchecked (算術オーバーフロー例外抑止)
- fixedステートメント
- lockステートメント
選択ステートメント
プログラム中で、ある条件を満たす(真:true)とき処理を分岐します。 C#では、if-else文、switch文が用意されています。
メモ:
C言語、C++では数値(0 or not 0)で判定しますが、C#はbool値で判定します。したがって値の結果で判定することはできません。
if-else文 (もし~ならば-それ以外ならば)
if-else |
- 条件式が真(true)の時分岐します。
- 文が1行の場合、{}”ちゅうかっこ”を省略することができます。
- if-else文は、入れ子にすることができます。
●パターン1 if (条件式1) { 文1 // 条件式が真のときに実行される }
●パターン2 if (条件式1) { 文1 // 条件式が真のときに実行される } else { 文2 // 条件式が真のときに実行される }
●パターン3 if (条件式1) { 文1 // 条件式が真のときに実行される } else if(条件式2) { 文2 // 条件式が真のときに実行される } else { 文3 // 条件式が偽のときに実行される }
例 // SubClassクラスのメソッドFunctionAの実行した結果を、変数 Answerへ代入 int Answer = SubClass.FunctionA(); if (Answer == 1) // Answerが1の時、真(true)になる { ・・・ } else if (Answer == 2) // Answerが2の時、真(true)になる { ・・・ } else // Answerが上記以外の時 { ・・・ }
if-else文は、条件式の真偽(true or false)によって処理を分岐します。条件式が真(true)のとき、文1が実行され、偽(false)のとき、文2が実行されます。else文は省略できます。
switch-case文 (この値が~ならば)
switch |
- switch文の変数値で処理を選択します。
- 使用可能な変数型は、整数型または文字列型のみです。
- case文の後に、条件値を書きます。break文は、switch文から抜けるために使用します。
- default文は、省略できます。
switch(変数) { case 値1: 複数文1 // 変数の値 == 値1 のとき実行される break; case 値2: 複数文2 // 変数の値 == 値2 のとき実行される break; ・ ・ default: // defaultは、省略可能 複数文 // 何れのケースにも当てはまらない場合に実行される break; }
例 // SubClassクラスのメソッドFunctionAの実行結果を、変数 Answer へ代入 int Answer = SubClass.FunctionA(); switch (Answer) // 変数Answerが { case 1: // 1ならば ・・・・ break; case 2 // 2ならば ・・・・ break; default: // 上記以外ならば ・・・・ break; }
繰り返しステートメント
プログラム中で繰り返しステートメントを使用すると、処理のループを構成することができます。繰り返しステートメントは、ループ終了条件に応じて、ループ内のブロックを繰り返し、順序通り実行します。ジャンプステートメントが検出されると、それにしたがった処理を実行します。
C#では、while文、、do文、、for文、、foreach文が用意されています。が用意されています。繰り返す回数が確定している場合、for文が最適です。それ以外の場合、while文またはdo文を用います。条件式が偽の場合、ループ・ブロックを1回も処理させたくない場合は、while文を使用し、1回は処理を行いたい場合はdo-while文を使用します。
配列やコレクションを全件処理する場合、foreach文を用いると簡単になります。
for文 (この条件回数の間、以下の処理を繰り返す)
for |
- はじめに初期化式が一度だけ実行されます。通常、条件式で使う変数を初期化します。初期化式は省略できます。
- 条件式を評価して真(true)の場合、ループ内を実行し完了すると、更新式が実行されます。
- 初期化式と更新式を省略 for (; 条件式; ) すると、while文と同等になります。
- 全てを省略すると、無限ループを構成することもできます。ステートメントブロック内に、ジャンプステートメントが必要です。
for (初期化式; 条件式; 更新式) { 複文 }
例 // 変数Countを1で初期化し、変数Countが10未満の間forブロックを実行する。 // forブロックを1回実行する毎に、変数Countを+1加算する。 for (int Count = 1; Count < 10; Count++) { // 繰り返し処理 }
for文の代わりに、while文を使って同等のループ処理を構成することもできます。
初期化式; while(条件式) { 複文 更新式; }
foreach-in文 (配列・コレクション全要素に対して、処理を繰り返し行う)
foreach-in |
- 配列またはオブジェクト・コレクションの全要素に対して、順番に要素を取得し一要素が要素変数に代入されます。
- ステートメントブロック内で、(予期しない動作を防ぐため)コレクション内容の変更には使用しないこと。
- 全要素に対する繰り返しが完了すると、制御は、foreach ブロックに続く次のステートメントに移動します。
foreach(要素変数 in 配列、コレクション名) { 複文 // 配列、コレクションの各要素に対して1回ずつ処理が行われる。 }
while文 (この条件の間、以下の条件を繰り返す)
while |
- 条件式が偽(false)になるまで、ステートメントブロックを実行します。
- はじめに条件式が偽(false)であれば、ステートメントブロックは実行されません。
初期化式; while(条件式) { 複文 // 更新式やジャンプステートメントが必要 }
do-while文 (この条件の間、上記の条件を繰り返す)
do-while |
- 条件式の判断を行う前に、ステートメントブロックを実行します。
- 無条件にステートメントブロックを1度は実行したい場合に用います。
初期化式; do { 複文 // 更新式やジャンプステートメントが必要 } while(条件式)
ジャンプステートメント
分岐はジャンプ ステートメントで実行されます。ジャンプ ステートメントは、プログラムの制御をすぐに移動します。
C#では、break文、continue文、goto文、return 文、throw文が用意されています。
break文 (内側の処理を終了する)
breakk |
- for文、switch文のステートメントブロックを終了する際に使用します。
for (int Count = 1; Count <= 10; Count++) { // 変数Countが条件を満たした場合 if (Count == 5) { // for 文を抜ける(次のステートメントへ制御を移す) break; } Console.WriteLine(Count); }
continue文 (以下の処理は行わず、繰り返しの先頭へ戻る)
continue |
- for文、while文、do文のステートメントブロック内で、制御を先頭に戻す際に使用します。
for (int Count = 1; Count <= 10; Count++) { if (Count < 9) { continue; // 変数Countが条件を満たす場合、繰り返し文の先頭へ戻る } Console.WriteLine(Count); }
goto文 (指定したラベルへジャンプ)
goto |
- goto文は、指定されたラベル付きステートメントへ制御を移動する際に使用します。
- switch文内では、caseラベル、default ラベルへ移動することもできます。
- goto文の使用は十分検討して下さい。goto文は使うべきではないと思っている方が多数おられます。
使用する際は、見やすさ・わかりやすさを考慮して下さい。
{ if (条件式) goto Lavel1; else goto Lavel2; Lavel1: 複数文 // ジャンプステートメントが無ければ、Lavel2以降も実行される Lavel2: 複数文 }
return文 (メソッドの処理を終了し、呼び出し元へ戻る)
return |
- return ステートメントは、メソッドの実行を終了し、呼び出し側のメソッドに制御を戻します。
- 省略可能な値を返すこともできます。メソッドの型が void 型の場合、return ステートメントは省略できます。
{ ・・・ return; }
throw文 (異常事態を通知する)
throw |
- throw ステートメントは、プログラムの実行中に例外という異常事態が発生したことを-呼び出し側のメソッドへ-通知するために使用します。
- スローされる例外は、クラスが System.Exceptionから派生したオブジェクトです。
- 通常、throw ステートメントは、try-catch または try-finally ステートメントで使用されます。例外がスローされると、プログラムは、この例外を処理する catch ステートメントを検索します。throw ステートメントを使用して、キャッチした例外を再びスローすることもできます。
{ ・・・ throw new ArgumentNullException(); }
yield文
列挙子オブジェクトに値を挿入する場合、または反復処理の終了を通知する場合に、iterator(イテレータ)ブロック内で使用されます。
yield |
yield return expression; yield break;
例外処理ステートメント
例外処理とは、プログラムの実行中に発生する例外という異常事態を処理する機能のことです。例外は、通常の制御の流れの外で処理されます。
- throw (例外の発生)
- try-catch (例外監視ブロック-例外処理)
- try-finally (例外監視ブロック-終了処理)
- try-catch-finally (例外監視ブロック-例外処理-終了処理)
try文~catch文~finally文
try-catch-finally |
- try-catch ステートメントは、try ブロックと、それに続く catch 句で構成されます。この句にはさまざまな例外のハンドラを指定します。
- finally ブロックは、例外の発生有無に関わらず実行する必要がるあるコードを記述します。常に finally ブロックに移動します。
try { throw new NullReferenceException(); } catch (NullReferenceException e) { throw (e); } catch { throw; } finally { Console.WriteLine("finallyブロック"); }
CheckedとUncheckedステートメント
C# ステートメントは、checked または unchecked のいずれかのコンテキストで実行されます。
- 算術オーバーフロー時に例外を発生させる場合、checkedコンテキストを使用します。
- 算術オーバーフロー時に例外を発生させない場合、unchecked コンテキストを使用します。結果は切り捨てます。
checked も unchecked も指定されない場合、既定のコンテキストはコンパイラ・オプションなどの外部要因によって決定されます。
CheckedとUnchecked |
- 次の演算は、オーバーフロー・チェックの対象です。
- 次の組み込み演算子を整数型に使用した式。
- ++ — - (単項) + - * /
- 整数型の間での明示的な数値変換。
- コンパイラ・オプション /checked の設定より、checked、またはuncheckedが優先されます。
short x = 32767; // Max short value short y = 32767; // Max short value int z; z = checked((short)(x + y)); z = unchecked((short)(x + y));
fixedステートメント
変数のアドレス(ポインタ)を固定します(ガベージ コレクタの再配置を抑止します)。
unsafe コンテキストでのみ使用可能です。
Fixed を使用して、固定サイズ バッファを作成することもできます。
fixed |
書式 fixed(型名* 変数名 = アドレス取得式) { 複文 } unsafe { fixed (int* p = &pt.x) { SquarePtrParam(p); *p = 10; } }
lockステートメント
指定のオブジェクトに対する相互排他ロックを取得し、ステートメントを実行し、ロックを解放するステートメント ブロックをクリティカル セクションとしてマークします。このステートメントの形式は、次のとおりです。
lock |
書式 lock(expression) {ステートメント・ブロック} expression : ロックするオブジェクト。expressionは参照型。 インスタンス変数を保護する場合はthis。 静的変数の保護、または指定されたクラスの静的メソッドでクリティカル・セクションが 発生する場合は typeof(class)。 Object thisLock = new Object(); lock(thisLock) { // クリティカル・セクションのステートメント // lock によって、あるスレッドがコードのクリティカル・セクションになっている // ときは、別のスレッドはクリティカル セクションにはなりません。 // ロックされたコードを別のスレッドが使おうとすると、オブジェクトが解放される // まで待機します。 }