
C#のyield returnとyield breakの使い方
C#にはたくさんのメソッドがあります。今回は、その中でもとても理解しやすくわかりやすいといわれるyield returnについて紹介します。この処理はreturnメソッドを使っている人におすすめの処理です。
今までこういったことで困ったことはないでしょうか。
- PG
- returnメソッドを使っているけど、値を返して処理が終わります。本当はそのまま続けて値を返したいものがあるのですが……
- PL
- メソッドのreturn命令は値を返したらそれで終わってしまいますね。実はreturn命令ではなくyield returnというイテレーター(メソッド)を使うとその時々に値を返せるので問題は解決しますよ。
目次
yield returnとは?イテレーターを理解しよう
yield returnの見た目はメソッドと一緒ですが、「イテレーター(メソッド)」に定義されます。イテレーターとは英語で繰り返しを意味します。プログラム言語によってイテレーターの解釈が違います。
C#では列挙子と呼ばれ、IEnumeratorによってあらわされます。イテレーターを使用することでコレクションクラスに対し要素を列挙することができるようになります。
C#のイテレーターは簡単にいうと、foreach命令で処理できるコレクションを生成するためのメソッドということになります。
イテレーターの戻り値
イテレーターの戻り値は、system.Collections.Generic.IEnumerator、またはIEnumerable型とします。
enumerateは「列挙する」という意味で、IEnumerator/IEnumerable型は「コレクションに対する反復処理を可能にする」ための型です。Tには、yield return命令で返す値の型を指定します。
yield returnの例文
とてもシンプルな例文です。一つずつ理解していましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
using System; using System.Collections; using System.Collections.Generic; class Test { // イテレーターを定義 public static IEnumerable<string> GetStrings() { yield return "ABC"; yield return "DEF"; yield return "GHI"; } static void Main() { foreach(var str in GetStrings()) { Console.WriteLine(str); } Console.ReadKey(); } } |
実行結果
1 2 3 |
ABC DEF GHI |
yield returnはただのreturnと同じくメソッドの値を呼び出し元に返します。しかし、return命令がその場で関数の実行を終了するのに対して、yield return命令は一時的に停止するだけです。
つまり次に呼び出されたときには、その時点から処理を再開できます。
7 8 9 10 11 12 |
Public string Getstrings() { return "ABC"; return "DEF"; return "GHI"; } |
このように書くと‘ABC’が実行され‘DEF’‘GHI’は実行されません
定義されたイテレーター Getstringsをforeachルームに渡し、yield return命令をすることで「ABC」「DEF」「GHI」が順に返されるというわけです。
yield breakとは?
yield return命令はメソッドをそのまま終了させることができません。
途中でメソッドを終了させたい場合はyield break命令を使用します。
yield breakの例文
次のコードでは、yield breakを使って処理を終了させています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
using System; using System.Collections; using System.Collections.Generic; class Test { // イテレーターを定義 public static IEnumerable GetIterator() { for(int a = 0; true; a++) { if(a == 2) yield break; yield return a; } } } static void Main() { foreach(object b in GetIterator()) { Console.WriteLine(b); } Console.ReadKey(); } } |
実行結果
1 2 |
0 1 |
- PG
- yield breakを使えば、このように処理を終了させることができるのですね。
- PL
- yield returnとyield breakはセットで覚えることが重要なのでしっかりと理解して使いこなしていくことが大切です。
こうすることによって順に値を返すプログラムを書くことができるんですね
yield return を使うことでメソッドの繰り返し処理をより視覚的に使うことができます
yield returnは初心者でも使いやすいので挑戦してみよう!
yield returnは他のメソッドと見た目が同じでプログラムの流れもreturn文とあまり変わりません。使いやすく処理の幅が拡がりますのでぜひ挑戦してみましょう。