MSDN에서이 구문을 yield break
보았지만 그 기능을 모르겠습니다. 아는 사람 있나요?
답변
반복자가 끝났음을 지정합니다. 값을 리턴하지 않는 명령문 yield break
으로 생각할 수 있습니다 return
.
예를 들어, 함수를 반복자로 정의하면 함수 본문은 다음과 같습니다.
for (int i = 0; i < 5; i++)
{
yield return i;
}
Console.Out.WriteLine("You will see me");
루프가 모든 사이클을 완료하면 마지막 줄이 실행되고 콘솔 앱에 메시지가 표시됩니다.
또는 다음과 같이 yield break
:
int i = 0;
while (true)
{
if (i < 5)
{
yield return i;
}
else
{
// note that i++ will not be executed after this
yield break;
}
i++;
}
Console.Out.WriteLine("Won't see me");
이 경우 마지막 명령문은 함수를 일찍 종료했기 때문에 실행되지 않습니다.
답변
반복자 블록을 종료합니다 (예 : IEnumerable에 더 이상 요소가 없다고 말함).
답변
반복자에게 끝까지 도달했음을 알려줍니다.
예로서:
public interface INode
{
IEnumerable<Node> GetChildren();
}
public class NodeWithTenChildren : INode
{
private Node[] m_children = new Node[10];
public IEnumerable<Node> GetChildren()
{
for( int n = 0; n < 10; ++n )
{
yield return m_children[ n ];
}
}
}
public class NodeWithNoChildren : INode
{
public IEnumerable<Node> GetChildren()
{
yield break;
}
}
답변
yield
기본적으로 IEnumerable<T>
메소드는 협력 적으로 (선점 적으로 반대로) 예약 된 스레드와 유사하게 작동합니다.
yield return
“schedule”또는 “sleep”함수를 호출하여 CPU 제어를 포기하는 스레드와 같습니다. 스레드와 IEnumerable<T>
마찬가지로이 메소드는 제어가 포기되기 전의 값과 동일한 값을 갖는 모든 로컬 변수를 사용하여 즉시 제어를 다시 얻습니다.
yield break
스레드가 기능의 끝에 도달하고 종료되는 것과 같습니다.
사람들은 “상태 머신”에 대해 이야기하지만 상태 머신은 모두 “스레드”입니다. 스레드에는 상태 (예 : 로컬 변수 값)가 있으며, 예약 될 때마다 새 상태에 도달하기 위해 몇 가지 조치를 수행합니다. 중요한 점은 yield
우리가 익숙한 운영 체제 스레드와 달리이 코드를 사용하는 코드는 반복이 수동으로 진행되거나 종료 될 때까지 시간에 고정된다는 것입니다.
답변
반복자 블록의 전체 주제는 Jon Skeet의 책 C # in Depth 의이 무료 샘플 장 에서 잘 설명되어 있습니다.
답변
yield break
문 정지에 열거됩니다. 실제로 yield break
추가 항목을 반환하지 않고 열거를 완료합니다.
실제로 반복자 메소드가 반복을 중지 할 수있는 두 가지 방법이 있습니다. 어떤 경우에는 메소드의 로직이 모든 항목을 반환 한 후 메소드를 자연스럽게 종료 할 수 있습니다. 예를 들면 다음과 같습니다.
IEnumerable<uint> FindPrimes(uint startAt, uint maxCount)
{
for (var i = 0UL; i < maxCount; i++)
{
startAt = NextPrime(startAt);
yield return startAt;
}
Debug.WriteLine("All the primes were found.");
}
위 예제에서 maxCount
프라임이 발견 되면 반복자 메소드는 자연스럽게 실행을 중지 합니다.
이 yield break
문은 반복자가 열거를 중단하는 또 다른 방법입니다. 열거 형을 일찍 벗어나는 방법입니다. 위와 같은 방법이 있습니다. 이번에는 메소드가 실행할 수있는 시간에 제한이 있습니다.
IEnumerable<uint> FindPrimes(uint startAt, uint maxCount, int maxMinutes)
{
var sw = System.Diagnostics.Stopwatch.StartNew();
for (var i = 0UL; i < maxCount; i++)
{
startAt = NextPrime(startAt);
yield return startAt;
if (sw.Elapsed.TotalMinutes > maxMinutes)
yield break;
}
Debug.WriteLine("All the primes were found.");
}
에 대한 호출을 확인하십시오 yield break
. 실제로 열거 형이 일찍 종료됩니다.
또한 yield break
작품은 평범한 것과 다르게 작동합니다 break
. 위의 예 yield break
에서를 호출하지 않고 메소드를 종료합니다 Debug.WriteLine(..)
.
답변
여기에 http://www.alteridem.net/2007/08/22/the-yield-statement-in-c/ 가 아주 좋은 예입니다.
공용 정적 IEnumerable <int> 범위 (int min, int max) { 동안 (true) { if (min> = max) { 항복 중단; } 수율 반환 min ++; } }
설명 yield break
은 메소드 내 에서 명령문이 적중 되면 해당 메소드의 실행이 리턴없이 중지된다고 설명합니다. 결과를 제공하지 않으려는 경우가 있습니다. 항복 중단을 사용할 수 있습니다.