繰り返し、foreach文を理解しよう!

[C#] 繰り返し、foreach文を理解しよう!

※ 当サイトは広告を含みます。

ここではC#のforeach文について理解しましょう。これはプログラムの基本構造で説明した反復にあたる処理です。
なお、プログラムの基本構造が分からない人は先に次の記事を読んでください。

foreach statement (ステートメント)

for文に名前が似てますよね。実際にところ亜種みたいなものです。
これは対象となるコレクションの全てに対して、繰り返し処理を行いたい場合に利用する構文です。

ここでコレクションの定義ですが、簡単に言えば配列やリストなどの複数個の値を所有する変数です。
より正確な内容を伝えるならSystem.Collections.IEnumerableまたはSystem.Collections.Generic.IEnumerableを実装したオブジェクトです。

りさ

どういうこと?

管理人

classの理解がないと説明できないから、今は配列とか複数要素で使える理解でいいよ。
では、続けて構文とサンプルコードの実行確認をしましょう。

foreach statement

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型の場合は要素が値型になるので、コレクションの要素は実体を示し、値を変更することはできません。

では、参照型の場合はどうでしょうか。

参照型の場合でも読み取り専用なことに変わりはありません。ただし、この読み取り専用とは参照値が読み取り専用なんです。

参照値の読み取り専用

結論として、参照値が示す先の値には読み取り専用は適用されません。つまりは値の書き換えが可能となります。

管理人

この知識は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型はどこかのタイミングできちんと解説します。

あとがき

個人的に繰り返しで1番利用するのがforeach文です。見た目も簡易的で分かりやすいんですよね。

◆ C#に関する学習コンテンツ

この記事は参考になりましたか?

👆このブログを支援する

関連記事

コメント

この記事へのコメントはありません。