이것은 C # yield 키워드 로, www
객체에 대해 특별한 작업을 수행하지 않고 그 안에 포함 된 메소드에 대해 특별한 의미를 IEnumerable
갖 습니다. 특히이 키워드는 (또는 IEnumerator
) 를 리턴하는 메소드에서만 사용할 수 있으며 사용 됩니다. MoveNext 가 호출 될 때 열거자가 "반환"할 개체를 나타냅니다 .
컴파일러는 어떤 구현하는 별도의 클래스로 전체있어서 변환 때문에 작동 IEnumerable
(또는 IEnumerator
상태 머신을 사용) - 최종 결과의 방법 자체의 본체는 리턴 값을 통해 누군가를 열거 할 때까지 실행되지 않는다는 점이다. 이것은 모든 유형에서 작동하며, 특별한 것은 없습니다 WWW
.
한 번 봐 가지고 는 C # 수율 키워드의 장면 뒤에 정렬 C # 컴파일러가 생성하는 코드의 무엇에 좀 더 통찰력을하거나 실험과 자신이 같은 것을 사용하여 코드 검사 IL 스파이
업데이트 : 명확히하기 위해
- Unity가
yield return
명령문 이 포함 된 코 루틴을 호출 하면 열거자가 반환된다는 것뿐입니다.이 시점에서 메소드 본문이 실행되지 않습니다.
- 메소드 본문이 Unity를 실행하게
MoveNext
하려면 시퀀스의 첫 번째 값을 얻기 위해 반복자를 호출해야합니다 . 이로 인해 메소드가 첫 번째 yeild return
명령문 까지 실행되어 호출자가 재개됩니다 (아마도 Unity는 나머지 프레임을 렌더링합니다)
- 내가 이해하는 것처럼 Unity는 정상적으로 호출합니다.
MoveNext
각 후속 프레임마다 반복기 메소드 메소드 yield return
의 끝이나 yield break
명령문에 도달 할 때까지 매 프레임마다 한 번 다음 명령문 까지 메소드를 다시 실행합니다. 순서의 끝)
유일한 특별 여기 비트 (과에서 몇 가지 의 다른 경우는 ) 대신에서만 다운로드가 완료되면 (계속 실행 방법을 일으키는) 반복자를 진행 유니티이 특정 반복자에게 다음 프레임을 진행하지 않습니다. 기지가있는 것처럼 보이지만반복자를 향상시켜야 할 때 Unity에 신호를 보내기 위한 일반적인 메커니즘을 포함하고 YieldInstruction 클래스가있는 WWW
것처럼 보이지만 클래스는이 클래스에서 상속 된 것으로 보이지 않으므로 특별한 경우가 있다고 가정 할 수 있습니다. Unity 엔진의이 클래스
명확하게 말하면- yield
키워드는 WWW
클래스에 특별한 작업을 수행하지 않고 Unity가 반환 된 열거 형 멤버 에게이 동작을 일으키는 특수 처리를 수행합니다.
두 번째 업데이트 :WWW
웹 페이지를 비동기 적으로 다운로드 하는 데 사용 되는 메커니즘 은 내부적으로 비동기 IO를 사용 하는 HttpWebRequest.BeginGetResponse 메소드 를 사용 하거나 스레드를 사용할 수 있습니다 (전용 스레드 작성 또는 스레드 풀 사용).
yield return
비동기 작업하는 해킹입니다. "실제"C # 프로그램에서는이를 위해을 사용합니다Task
. Unity는 .Net 4.0 이전에 만들어 졌기 때문에 Unity를 사용하지 않았을 것입니다Task
.