レガシーコードからの脱却

レガシーな職場でも独学でどうにか頑張っていくブログです。

【お勉強記録】C#文法学び直し。yield

いまさらですけど、ちょっとあやふやになっていたC#の文法を改めて学びなおしています。

yieldについて

自分でコレクションクラスを作る場合、イテレータのインターフェースに対応するメソッドを実装必要があるけど、簡単に実装できる方法がイテレータ構文(yeild)。 イテレータはコレクションの要素を順次取り出す機能のこと。

using System;
using System.Collections.Generic;
using System.Collections;


namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            var lists = new Example_Iterator();
            //遅延実行されてるか確かめるために何か表示してみる
            Console.WriteLine("BerforeForeach");
            foreach (var item in lists)
            {
                Console.WriteLine(item.ToString());
            }
            //コンソールを表示したままにするために入力を待つ。
            Console.ReadLine();
        }
    }

    public class Example_Iterator:IEnumerable
    {
        public IEnumerator GetEnumerator()
        {
            Console.WriteLine("ONE");
            yield return 1;
            Console.WriteLine("TWO");
            yield return 2;                 
            Console.WriteLine("THREE");
            yield return 3;            
        }
    }

}

実行結果は

BerforeForeach
ONE
1
TWO
2
THREE
3

きちんとyeild returnで処理が止まってそうです。 また、取り出しの時に初めて処理が行われています。

イテレータブロックでは戻り値の型が

  • IEnumerable
  • IEnumerable<T>
  • IEnumerator
  • IEnumerator<T>

のいずれかに。

ちなみにyeildの読みはWeblioで聞いた感じだと「いぃーろぉ」に聞こえました。