これは、列挙子プロパティを持つ var 型の非常に単純な (そして無意味な) 例です。IEnumerator
このスニペットのポイントは、インターフェイスを実装する厳密に型指定されたクラスを使用してコレクションを試すことです。
public class num { public int value { get; set; } }
class Program {
private int[] data = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
static void Main(string[] args) {
Program p = new Program();
var numbers = selectNumbers(p.data);
foreach(num x in numbers) {
Console.WriteLine("Found {0}", x.value.ToString());
}
Console.WriteLine("press [enter] to exit");
Console.Read();
}
static IEnumerable<num> selectNumbers(int[] x) {
//in production app the following would use a reader to get data from database
for(int i = 0; i < x.Length; i++) {
yield return new num { value = x[i] };
Console.WriteLine("Found {0}", x[i].ToString()); // <<<(1)
}
}
}
コンソールに返される結果は少し奇妙です。結果は、ループの繰り返しが実行されるたびに、foreach
行 (1) も実行されることを示唆しているようです。
これは、この構造をデータベース設定アプリケーションに実装した場合、selectNumbers
データベースとの接続に関係する場合、IEnumerator が使用されるたびに接続が確立されるということですか? foreach
たとえば、厳密に型指定されたものに対してループを使用するたびにnum
、データベースにアクセスすることになりますか? この例の結果は、そうであることを示唆しているようです。