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 다음 코드부터 실행하는 것처럼 동작한다.
✍ 샘플 코드
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