ここではC#のforeach文について理解しましょう。これはプログラムの基本構造で説明した反復にあたる処理です。
なお、プログラムの基本構造が分からない人は先に次の記事を読んでください。
プログラムの基本構造とは何でしょうか? これは特定のプログラミング言語に限らず、どの言語にも応用できる話です。内容は非常にシンプルで難しくありません。今後の助けになるので、ぜひ理解してください。 3つの基本構造 先に名前を出すと順次、選択、反復です。この3つの構造を使えば、どんなプログラムでも作れると言われてます。では、この3つは何を意味するのでしょうか。順番に解説していきます。 順次 (sequence) 最もシンプルな構造で、処理が上から下に進むことを...
foreach statement (ステートメント)
for文に名前が似てますよね。実際にところ亜種みたいなものです。
これは対象となるコレクションの全てに対して、繰り返し処理を行いたい場合に利用する構文です。
ここではC#のfor文とwhile文について理解しましょう。これはプログラムの基本構造で説明した反復にあたる処理です。なお、プログラムの基本構造が分からない人は先に次の記事を読んでください。 for statement (ステートメント) いわゆる繰り返し処理でfor文と呼びます。これは条件式を満たす限り、同じ処理を永遠と繰り返す構文です。 ポイントは次の3つです。 初期化で変数を宣言する 条件式に繰り返し条件を記述する 反復式で変数をインクリメ...
ここでコレクションの定義ですが、簡単に言えば配列やリストなどの複数個の値を所有する変数です。
より正確な内容を伝えるならSystem.Collections.IEnumerableまたはSystem.Collections.Generic.IEnumerable<T>を実装したオブジェクトです。
どういうこと?
classの理解がないと説明できないから、今は配列とか複数要素で使える理解でいいよ。
では、続けて構文とサンプルコードの実行確認をしましょう。
namespace Sample
{
internal class Program
{
static void Main(string[] args)
{
int[] array = new int[] { 10, 20, 30, 40, 50, 60, 70, 80, 90 };
foreach (int n in array) // コレクションを指定する
{
Console.WriteLine(n); // 要素の表示
}
}
}
}
このようにコレクション内の要素が順番に取得できます。
簡単で便利そう!
indexアクセスが不要でコードの記述量が少ないから、コレクションに対する処理はforeachを使うのが一般的だよ。
foreachの特性と注意
便利なforeachにも特性と注意があります。それを実感するため次のサンプルコードを実行しましょう。
namespace Sample
{
internal class Program
{
static void Main(string[] args)
{
int[] array = new int[] { 10, 20, 30, 40, 50, 60, 70, 80, 90 };
foreach (int n in array)
{
n *= 10;
}
}
}
}
ビルドエラーで実行できません。
それで正しいよ。今回はビルドエラーになることを確認して欲しかったんだ。
これはC#のforeachの特性で、foreachから得られる値は読み取り専用になるよ。
じゃあ、書き換えたい場合はfor文を使えばいいんですか?
そうだね。でも、もう少しforeachについて知ってほしいな。
さっき話した読み取り専用の意味は、コレクションの要素が読み取り専用です。
そしてint型の場合は要素が値型になるので、コレクションの要素は実体を示し、値を変更することはできません。
では、参照型の場合はどうでしょうか。
参照型の場合でも読み取り専用なことに変わりはありません。ただし、この読み取り専用とは参照値が読み取り専用なんです。
結論として、参照値が示す先の値には読み取り専用は適用されません。つまりは値の書き換えが可能となります。
関数(※1)を学んだことで、ついに値型と参照型の違いを知ることができます。ここではC#で最重要とも言える値型と参照型の違いを理解しましょう。 ※1現在の知識を踏まえて、ここではメソッドではなく関数と呼びます。 値型と参照型の復習 まずは値型と参照型について復習しましょう。この2つは値を保存する場所が大きなポイントになります。 値型 値型とは用意した領域に直接的に値を保存します。 参照型 参照型は値を別の領域に格納し、それを...
この知識はclassまで進むと重要な情報になるんだ。今だと説明できる材料がないからforeachの特性として理解しておこうね。
なるほど。つまり参照型のstring型なら書き換えができるんですか?
賢い子はそこに気がつく! では、このサンプルコードをどうぞ。
namespace Sample
{
internal class Program
{
static void Main(string[] args)
{
string[] array = new string[] { "A", "B", "C" };
foreach (string s in array)
{
s = "ZYX";
}
}
}
}
動きません...
そうなんです。ここで話すと本題からズレるから避けるけど、参照型なのにstring型は書き換えできません。
これはC#の性質としか言えなくて、C#の文字列は動作的には値型みたいな動きをします。故に書き換えができないんです。
なんて厄介な仕組み。
残念だけど、そういうルールとして理解してもらうしかない。string型はどこかのタイミングできちんと解説します。
参照型の中でも特殊な動作をするstring型ですが、利用頻度はとても多いです。 例えば画面上に文字を表示する、動作記録をファイルに残すとか、これらは全て文字列を経由します。ここでは、そんな文字列についての知識を深め、より色々な場面で活用できるようになりましょう。 参照型と値型のどっち? 結論としてstring型は参照型です。ただし、以前にも伝えた通り動作的には値型です。これはいくら悩んでも意味がなく、C#の言語仕様で決まってるからです。 それを確認するサンプルコー...
あとがき
個人的に繰り返しで1番利用するのがforeach文です。見た目も簡易的で分かりやすいんですよね。
◆ C#に関する学習コンテンツ
この記事は参考になりましたか?
コメント