yield 키워드
yield 키워드는 해당 키워드가 표시되는 메서드가 반복기 블록임을 컴파일러에 나타냅니다.
컴파일러는 클래스를 생성하여 반복기 블록에 표현된 동작을 구현합니다.
반복기 블록에서 yield 키워드를 return 키워드와 함께 사용하여 열거자 개체에 값을 제공합니다.
예를 들어, 이 값은 foreach 문의 각 루프에서 반환되는 값입니다.
또한 yield 키워드를 break와 함께 사용하여 반복의 끝을 나타냅니다.
다음은 두가지 형태의 yield 문입니다.
yield return <expression>;
yield break;
yield return 문은 각 요소를 한 번에 하나씩 반환하기 위해 사용합니다.
foreach 문 또는 LINQ 쿼리를 사용할 때 반복기 메서드를 소비합니다.
foreach 루프의 각 반복마다 반복기 메서드를 호출합니다.
반복기 메서드에서 yield return 문에 도달한 경우, expression이 반환되고, 코드의 현재 위치가 유지됩니다. 다음 번의 반복기 함수 호출 시에, 해당 위치부터 실행이 재개되며 , 해당 반복을 종료하기 위해 yield break 문을 사용할 수 있습니다.
반복기 메서드 및 Get 접근자
반복기의 선언은 다음 요구 사항을 충족해야 합니다.
반환 형식은 IEnumerable, IEnumerable<T>, IEnumerator, 또는 IEnumerator<T> 가 되어야 합니다.
선언에 ref 또는 아웃 매개 변수가 들어갈 수 없습니다.
IEnumerable 또는 IEnumerator를 반환하는 반복기의 yield 형식은 object입니다.
반복기가 IEnumerable<T> 또는 IEnumerator<T>를 반환할 경우 yield return 문의 식 형식에서 제네릭 형식 매개 변수로
암시적 변환이 있어야 합니다.
public static IEnumerable Power(int number, int exponent)
{
int counter = 0;
int result = 1;
while (counter++ < exponent)
{
result = result * number;
yield return result;
}
}
static void Main(string[] args)
{
foreach (int i in Power(2, 8))
{
Console.Write("{0} ", i);
}
}
//-- 결과
//2 4 8 16 32 64 128 256
foreach 루프 반복 중에, elements에 대한 MoveNext 메서드가 호출됩니다.
이 호출은 다음 yield return 문에 도달할 때까지 본문을 실행합니다.
yield return 문의 반환 식은, 루프 본문에서 소비하는 변수의 값을 결정할 뿐 아니라, Current 속성 또한 결정합니다.
* IEnumerable 또는 IEnumerator 항 참조
http://parksh86.tistory.com/123
[참고]
https://msdn.microsoft.com/ko-kr/library/9k7k7cf0(v=vs.100).aspx
https://msdn.microsoft.com/ko-kr/library/58e146b7.aspx
'프로그래밍 > C#' 카테고리의 다른 글
[C#] event 키워드 (0) | 2016.12.23 |
---|---|
[C#] Serialization - 객체 직렬화 (0) | 2016.10.29 |
[C#] where & Generics (형식 제약 조건) (0) | 2016.10.29 |
[C#] 무명 메서드(Anonymous Methods) (0) | 2016.09.29 |
[C#] IEnumerable , IEnumerator 인터페이스 (0) | 2016.09.29 |