[C# 2.0] yield return/break

eunjin lee·2022년 9월 12일
0

C# 9.0 프로그래밍

목록 보기
22/50

yield return이나 yield break 예약어를 이용하면, IEnumberable, IEnumerator 인터페이스를 구현하는 코드를 간편하게 표기할 수 있다.


✍ 샘플 코드

    class Test
    {
        static void Main(string[] args)
        {
            foreach(int n in YieldNaturalNumber.Next())
            {
                Console.WriteLine(n);
            }
        }
    }

    class YieldNaturalNumber
    {
        public static IEnumerable<int> Next()
        {
            int _number = 0;
            while (true)
            {
                _number++;
                if (10 < _number)
                {
                    yield break;
                }

                yield return _number;
            }
        }
    }

✅ 결과

1
2
3
4
5
6
7
8
9
10

Next() 메서드에서 yield return에서 값을 반환하면 Next() 메서드의 실행을 잠시 중지하고 Main() 함수에게 값을 리턴한 후 Main() 함수가 해당 값을 갖고 실행을 하게 한 뒤 다시 Next() 메서드로 돌아와 yield return 다음 코드부터 실행하는 것처럼 동작한다.


그러나 내부적으로 정말 이렇게 동작하는 것은 아니다. 내부적으로는 아래와 같이 IEnumberable/IEnumerator을 구현한 코드로 동작한다.

✍ 샘플 코드

    class Test
    {
        static void Main(string[] args)
        {
            NaturalNumber nn = new NaturalNumber();

            foreach(int n in nn)
            {
                Console.WriteLine(n);
            }
        }
    }

    class NaturalNumber : IEnumerable<int>
    {
        public IEnumerator<int> GetEnumerator()
        {
            return new NaturalNumberEnumerator();
        }

        IEnumerator IEnumerable.GetEnumerator()
        {
            return new NaturalNumberEnumerator();
        }

        public class NaturalNumberEnumerator : IEnumerator<int>
        {
            int _current;
            public int Current => _current;

            object IEnumerator.Current => _current;

            public void Dispose()
            {
                Console.WriteLine("Disposed");
            }

            public bool MoveNext()
            {
                _current++;
                if (_current > 10)
                    return false;
                return true;
            }

            public void Reset()
            {
                _current = 0;
            }
        }
    }

✅ 결과

1
2
3
4
5
6
7
8
9
10
Disposed

0개의 댓글