C#에서 "수익률 깨짐;"은 무엇을 합니까?
MSDN에서 이 구문을 본 적이 있지만, 무엇을 하는지는 모르겠습니다.아는 사람이 있나요?
반복기가 종료되었음을 지정합니다.라고 생각할 수 있습니다.yield breakreturn값을 반환하지 않는 문입니다.
예를 들어, 함수를 반복기로 정의하는 경우 함수의 본문은 다음과 같습니다.
for (int i = 0; i < 5; i++)
{
yield return i;
}
Console.Out.WriteLine("You will see me");
루프가 모든 사이클을 완료한 후 마지막 줄이 실행되고 콘솔 앱에 메시지가 표시됩니다.
니면이렇게아▁this게.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");
이 경우 함수를 일찍 종료했기 때문에 마지막 문이 실행되지 않습니다.
반복기 블록을 종료합니다(예: IEnumberable에 더 이상 요소가 없다고 함).
반복자에게 끝에 도달했음을 알립니다.
예를 들어,
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와 같습니다. 로 "스케줄" "슬립" "슬립"입니다. 스레드와 마찬가지로,IEnumerable<T>방법은 모든 로컬 변수가 제어를 포기하기 전과 동일한 값을 가지면서 즉시 해당 지점에서 제어를 다시 가져옵니다.
yield break스레드가 기능의 끝에 도달하여 종료되는 것과 같습니다.
사람들은 "상태 기계"에 대해 이야기하지만, 상태 기계는 모두 "실"입니다.스레드에는 일부 상태(즉, 로컬 변수의 값)가 있으며, 예약될 때마다 새 상태에 도달하기 위해 몇 가지 작업이 필요합니다.핵심내에 대한 은 다음과 .yield즉, 우리에게 익숙한 운영 체제 스레드와 달리, 이를 사용하는 코드는 수동으로 진행되거나 종료될 때까지 시간이 지남에 따라 동결됩니다.
그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(..).
수익률 중단은 마지막으로 수익률을 말하고 값을 반환하지 않는 방법입니다.
예
// returns 1,2,3,4,5
IEnumerable<int> CountToFive()
{
yield return 1;
yield return 2;
yield return 3;
yield return 4;
yield return 5;
yield break;
yield return 6;
yield return 7;
yield return 8;
yield return 9;
}
여기 http://www.alteridem.net/2007/08/22/the-yield-statement-in-c/ 이 매우 좋은 예입니다.
공개 정적 IEnumberable <int> 범위(int min, int max ){반면에 (참){if (최소 > = max ){항복 브레이크;}수율 리턴 최소 ++;}}
그리고 설명, 만약에yield break메서드 내에서 문이 히트되면 해당 메서드의 실행이 중지되고 반환되지 않습니다.결과를 제공하지 않으려는 경우에는 수율 브레이크를 사용할 수 있습니다.
다른 좋은 대답들을 제외하고, 참고하세요.yield break정상처럼 작동하지 않습니다.break중첩 루프의 경우.어디서break현재 루프만 정지하고 외부 루프는 정지하지 않습니다.yield break전체 열거를 중지합니다.
IEnumerable<int> Iterate() {
for(int i=0; i<5; i++) {
yield return i;
for(int j=0; j<5; j++) {
if ((i*10 + j) > 30)
// This will stop the whole enumeration, even if there's
// an outer "for" loop
yield break;
yield return (i*10 + j);
}
}
}
Console.WriteLine(string.Join(", ", Iterate().Select(i => i.ToString())));
// 0, 0, 1, 2, 3, 4, 1, 10, 11, 12, 13, 14, 2, 20, 21, 22, 23, 24, 3, 30
수율 키워드는 열거자 개체에 값을 제공하기 위해 반환 키워드와 함께 사용됩니다.수율 반환 값은 반환되는 값을 지정합니다.수율 반환 문에 도달하면 현재 위치가 저장됩니다.다음 번에 반복기를 호출할 때 이 위치에서 실행이 다시 시작됩니다.
예를 들어 의미를 설명합니다.
public IEnumerable<int> SampleNumbers() { int counter = 0; yield return counter; counter = counter + 2; yield return counter; counter = counter + 3; yield return counter ; }
이 값이 반복될 때 반환되는 값은 0, 2, 5입니다.
이 예에서 카운터 변수는 로컬 변수입니다.2의 값을 반환하는 두 번째 반복 후, 세 번째 반복은 2였던 counter라는 로컬 변수의 이전 값을 유지하면서 이전에 떠난 위치에서 시작됩니다.
언급URL : https://stackoverflow.com/questions/231893/what-does-yield-break-do-in-c
'programing' 카테고리의 다른 글
| MongoDB Realm을 올바르게 이해합니까? (0) | 2023.05.12 |
|---|---|
| Python의 문자열 기반 열거형 (0) | 2023.05.07 |
| MongoDBC# 드라이버:삽입 시 속성 무시 (0) | 2023.05.07 |
| 확장 메서드를 일반적이지 않은 정적 클래스에 정의해야 합니다. (0) | 2023.05.07 |
| MongoDB Shell에서 ISO 날짜에 일 추가/감산 (0) | 2023.05.07 |