この章のテーマ §
yield return文、yield break文、列挙オブジェクトについて学びます。
前提知識 §
Console.WriteLineメソッド, 変数の基礎, メソッドの基礎, 条件演算子, int型, foreach文, ジェネリック
解説 §
foreach文などで列挙できる対象は、通常配列などのコレクションです。
しかし、列挙機能は簡単に自作できます。
以下の条件を満たすメソッドを書くだけです。
- 戻り値の型がIEnumerable<T> (Tは列挙する値の型)
- yield return文で列挙する値を伝える
- 途中で打ち切る時はyield breakを呼ぶ
サンプルソースのDoubleCountメソッドは、この機能を用いて、1から順に2倍ずつ増えていく値を列挙します。そして、100を超えたらそこで列挙を打ち切ります。
罠の数々 §
- この機能は実際にはSyntax Sugar(実際には存在しないが、ソースコード上では存在するように見せかける機能)である。そのため、一部の機能で制限を受けることがある。たとえば、in、ref、out パラメーターは使用できない
- 正攻法でIEnumerable<T>インターフェースを実装するという実現方法もあるが、手間が掛かるのであまり見かけない
参考リンク §
反復子 (C#)
サンプルソース: kw_yield §
foreach (var item in DoubleCount())
{
Console.WriteLine(item);
}
IEnumerable<int> DoubleCount()
{
int a = 1;
for(; ; )
{
if (a > 100) yield break;
yield return a;
a *= 2;
}
}
実行結果 §
1
2
4
8
16
32
64
リポジトリ §
https://github.com/autumn009/CSharpPrimer2
練習問題 §
以下のプログラムの実行結果を予測してみよう。
int yield = 1;
Console.WriteLine(yield);
- yieldは予約語だからエラーになる
- 列挙を始めてしまい、1,2,3……を出力する
- 1
- yieldのあとにreturnを書き足せば動く
- yieldのあとにbreakを書き足せば動く
[[解答]]