この章のテーマ §
1つしか文を書けない場所に複数の文を書くための複文(ブロック/Blocks)の機能を学びます。シンプルですが、ソースコードを高機能かつ分かりやすくする切り札です。
前提知識 §
Console.Writeメソッド, for文, if文, 変数の基礎
解説 §
C#の文法には、「一つの文だけを相手に機能する文」が多くあります。
例えば、if文は後続する1つの文だけを条件によって実行します。
しかし、1つの文だけという制約はあまり嬉しいものではありません。
そういう場合には、複文(ブロック)を使います。
複文は複数の文を波括弧{}で囲うことで、擬似的に全体を1つの文と見なす機能です。
ですから、A; B;というコードは2つの文からなりなっていますが、波括弧で書こうと{A;B}となって、これは全体が1つの文と見なされます。
サンプルソースを見ると、
if (i == 0) Console.WriteLine("A"); Console.WriteLine("B");
の場合、iが0の時に実行するのはConsole.WriteLine("A");だけです。Console.WriteLine("B");はif文とは関係なくいつも実行されます。
しかし、
if (i == 0) { Console.WriteLine("C"); Console.WriteLine("D"); }
の場合、全体が囲われているので、{ Console.WriteLine("C"); Console.WriteLine("D"); }全体がif文の影響下にあります。ですから、iが0以外なら1つも実行されません。
罠の数々 §
- 複文には変数のスコープを区切るという重要な機能がもう1つある。変数の寿命を制御する重要な機能なので、スコープを学んだときに思い出してみよう。
- 複文はネストできる。つまり複文の中に複文があってもよい。しかし意味がない複文の階層はソースコードが読みにくくなるだけなのでやめておこう。しかし意味があったらいくらネストしても良い
参考リンク §
ステートメント (Blocks参照)
サンプルソース: blocks §
for (int i = 0; i < 2; i++)
{
Console.WriteLine($"i={i}の場合");
if (i == 0) Console.WriteLine("A"); Console.WriteLine("B");
if (i == 0) { Console.WriteLine("C"); Console.WriteLine("D"); }
}
実行結果 §
i=0の場合
A
B
C
D
i=1の場合
B
リポジトリ §
https://github.com/autumn009/CSharpPrimer2
練習問題 §
上記サンプルソースにはif文の他にもう一箇所複文を使っている箇所がある。for文にも複文が使われている。理由は何だろうか。
[[解答]]