yield(C# 참조)
사용 하는 경우는 yield 키워드를 문에 나타낼 메서드, 연산자, 또는 get 표시 되는 반복기 접근자입니다.반복기를 사용 하면 컬렉션에서 사용자 지정 반복을 수행 합니다.다음 예제에서는 두 가지는 yield 문.
yield return <expression>;
yield break;
설명
사용 하는 yield return 문을 한 번에 각 요소를 반환 합니다.
반복기 메서드를 사용 하 여 소비는 foreach 문 또는 LINQ 쿼리 합니다.각 반복의 foreach 루프 반복기 메서드를 호출 합니다.경우는 yield return 문에 도달 반복기 메서드를 expression 반환 됩니다 코드에서 현재 위치를 유지 합니다.실행 위치에서 다음 반복기 함수가 호출 될 때 다시 시작 됩니다.
사용할 수 있는 yield break 문은 반복을 종료 하.
반복기에 대한 자세한 내용은 반복기(C# 및 Visual Basic)를 참조하십시오.
반복기 메서드 및 접근자 get
반복기의 선언에 다음과 같은 요구 사항을 충족 해야 합니다.
The return type must be IEnumerable, IEnumerable<T>, IEnumerator, or IEnumerator<T>.
식의 형식에서의 암시적 변환이 존재 해야는 yield return 문은 반복기의 반환 형식입니다.
포함할 수 없습니다는 yield return 또는 yield break 문에서 메서드는 다음과 같은 특징이 있습니다.
무명 메서드입니다.자세한 내용은 무명 메서드(C# 프로그래밍 가이드)을 참조하십시오.
안전 하지 않은 블록을 포함 하는 방법입니다.자세한 내용은 unsafe(C# 참조)을 참조하십시오.
예외 처리
A yield return 문을 try-catch 블록에서 찾을 수 없습니다.A yield return 문에 try-finally 문은 try 블록에서 찾을 수 있습니다.
A yield break try 블록 또는 catch 블록에서 문을 찾을 수 아니라는 finally 블록을 사용 합니다.
경우는 foreach 본문 (외부 반복기 메서드) 예외를 throw는 finally 블록이 반복기 메서드를 실행 합니다.
기술 구현
다음 반환 코드는 IEnumerable<string> 에서 반복기 메서드 및 다음 해당 요소를 반복 합니다.
IEnumerable<string> elements = MyIteratorMethod();
foreach (string element in elements)
{
…
}
호출을 MyIteratorMethod 메서드의 본문이 실행 되지 않습니다.대신 호출에서 반환 된 IEnumerable<string> 에 elements 변수.
반복 중에 foreach 루프의 MoveNext 메서드 호출에 대 한 elements.본문에이 호출을 실행 합니다. MyIteratorMethod 다음까지 yield return 문에 도달 합니다.반환 하는 식의 yield return 문은 값 뿐만 아니라 결정는 element 변수는 루프 본문에서 소비에 대 한 뿐만 아니라는 Current 속성 요소는 IEnumerable<string>.
각 후속 반복에서의 foreach 어디에서 반복기 본문의 실행을 계속 하 여 반복에 이르렀을 때를 다시 중지 해제 상태로 yield return 문.foreach 루프를 완료 하면 끝 반복기 메서드 또는 yield break 문에 도달.
예제
다음 예제는 yield return 문 내부에 for 루프.각 반복의 foreach 문의 본문에 Process 호출을 만듭니다의 Power 반복기 기능입니다.반복기 함수를 호출할 때마다 다음 실행에 진행 되는 yield return 의 다음 반복 동안에 발생 하는 문의 for 루프.
반복기 메서드 반환 형식이 IEnumerable, 반복기 인터페이스 형식입니다.반복기 메서드 호출 되 면 숫자의 거듭제곱이 들어 있는 열거 가능한 개체를 반환 합니다.
public class PowersOf2
{
static void Main()
{
// Display powers of 2 up to the exponent of 8:
foreach (int i in Power(2, 8))
{
Console.Write("{0} ", i);
}
}
public static System.Collections.IEnumerable Power(int number, int exponent)
{
int result = 1;
for (int i = 0; i < exponent; i++)
{
result = result * number;
yield return result;
}
}
// Output: 2 4 8 16 32 64 128 256
}
다음 예제는 get 접근자는 반복기입니다.예제에서 각 yield return 사용자 정의 클래스의 인스턴스를 반환 하는 명령문입니다.
public static class GalaxyClass
{
public static void ShowGalaxies()
{
var theGalaxies = new Galaxies();
foreach (Galaxy theGalaxy in theGalaxies.NextGalaxy)
{
Debug.WriteLine(theGalaxy.Name + " " + theGalaxy.MegaLightYears.ToString());
}
}
public class Galaxies
{
public System.Collections.Generic.IEnumerable<Galaxy> NextGalaxy
{
get
{
yield return new Galaxy { Name = "Tadpole", MegaLightYears = 400 };
yield return new Galaxy { Name = "Pinwheel", MegaLightYears = 25 };
yield return new Galaxy { Name = "Milky Way", MegaLightYears = 0 };
yield return new Galaxy { Name = "Andromeda", MegaLightYears = 3 };
}
}
}
public class Galaxy
{
public String Name { get; set; }
public int MegaLightYears { get; set; }
}
}
C# 언어 사양
자세한 내용은 C# 언어 사양을 참조하십시오. 이 언어 사양은 C# 구문 및 사용법에 대한 신뢰할 수 있는 소스입니다.