이 글은 기계 번역의 미러 문서이며, 원본 기사로 바로 이동하려면 여기를 클릭해 주세요.

보기: 26370|회답: 0

[출처] C# yield 키워드의 사용

[링크 복사]
게시됨 2019. 5. 29. 오전 9:55:11 | | | |
1. yield에 의해 구현된 함수들

수익률:

다음 코드를 살펴보겠습니다. 이 코드는 foreach를 통해 yield return을 통해 배열을 탐색하는 함수와 유사한 기능을 구현하고 있으며, yield return이 반복자 함수 구현에도 사용됨을 나타냅니다.

수율 브레이크:

아래 코드를 보면 1과 2만 출력되고 3은 출력되지 않아 반복기가 yield break로 중단되었으므로 yield break를 사용해 반복을 종료합니다.

2. 메서드<T><T>, 연산자, IEnumerable, IEnumerator를 반환해야 하는 accessor에서만 사용할 수 있습니다.

3. yield 키워드의 구현 원칙

foreach 루프를 while 루프로 대체했는데, GetEnumerator()를 구현하지 않았고, 해당 IEnumerator의 MoveNext(), Current 속성도 구현하지 않았지만 여전히 이 함수들을 다룰 수 있었습니다.

왜 그런지에 대해서는, ILSpy를 사용해 생성된 exe를 디컴파일하여 원인을 찾을 수 있습니다.

C#로의 직접 디컴파일은 현재와 같아지기 때문입니다



따라서 가독성은 떨어지지만 원리를 자세히 이해할 수 있는 C# 주석을 사용하는 IL 코드로 디컴파일하기로 결정했습니다.
먼저 프로그램의 번역을 살펴보겠습니다. 컴파일 과정에서 자동으로 새로운 클래스가 생성됩니다.



코드를 좀 더 자세히 살펴보면, EnumerableFuc()가 이 새로운 클래스를 반환합니다.



이 코드가 자동으로 생성하는 클래스 구현을 보면, IEnumerable<T>, IEnumerable, IEnumerator, 또는 IEnumerator를 상속받는다는 것을 알 수 있습니다. 이 <T>새로운 클래스 때문에 해당 IEnumerator의 MoveNext()와 Current 속성을 구현하지 않지만, 여전히 이 함수들을 정상적으로 사용할 수 있습니다.



이 클래스가 어떻게 반복하는지 살펴보겠습니다. 주로 MoveNext() 함수를 살펴보겠습니다





MoveNext() 함수를 호출할 때마다 상태에 1이 더해지며, 총 4번의 반복이 이루어지는데, 처음 세 번은 참, 마지막 번은 거짓으로 돌아가 반복이 끝난다. 이 네 번의 반복은 enumberableFuc()에서 4부분으로 나뉘어 반환 문장에 해당합니다.

enumberableFuc() 로 반복하는 실제 과정은 다음과 같습니다:

1. enumberableFuc() 함수를 실행하여 코드에 의해 자동으로 생성된 클래스 인스턴스를 얻습니다.
2. 그 다음 GetEnumberator() 함수를 호출하여 획득한 클래스 자체를 반복자로 시작한다.
3. MoveNext()를 실행할 때마다 상태가 1씩 증가하며, switch 문은 MoveNext(를 호출할 때마다 코드의 다른 부분을 실행할 수 있게 합니다).
4。 MoveNext()는 false를 반환하여 끝을 표시합니다.
이는 또한 yield 키워드가 실제로는 구문 슈가이며, 궁극적으로 IEnumberable<T>, IEnumberable, <T>IEnumberator, IEnumberator 인터페이스를 구현하여 반복 함수임을 보여줍니다.





이전의:. .NET 복원력 및 일시적 실패 처리 폴리 재시도 전략
다음:HttpResult는 쿠키 대신 세트 쿠키를 받습니다
면책 조항:
Code Farmer Network에서 발행하는 모든 소프트웨어, 프로그래밍 자료 또는 기사는 학습 및 연구 목적으로만 사용됩니다; 위 내용은 상업적 또는 불법적인 목적으로 사용되지 않으며, 그렇지 않으면 모든 책임이 사용자에게 부담됩니다. 이 사이트의 정보는 인터넷에서 가져온 것이며, 저작권 분쟁은 이 사이트와는 관련이 없습니다. 위 내용은 다운로드 후 24시간 이내에 컴퓨터에서 완전히 삭제해야 합니다. 프로그램이 마음에 드신다면, 진짜 소프트웨어를 지원하고, 등록을 구매하며, 더 나은 진짜 서비스를 받아주세요. 침해가 있을 경우 이메일로 연락해 주시기 바랍니다.

Mail To:help@itsvse.com