C \ # 키워드 의 yield (교체 기)

오늘 교체 기 에 대해 서 는 교체 기 에 있 는 yield 키 워드 를 연구 했다.
 
yield 하면 교체 기 를 먼저 말 해 야 합 니 다.교체 기 는 C \ # 2.0 의 새로운 기능 입 니 다. 그것 이 있 으 면 우 리 는 자신의 클래스 나 구조 에서 foreach 교 체 를 지원 할 수 있 습 니 다. 전체 IEnumerable 인 터 페 이 스 를 실현 하지 않 아 도 됩 니 다. 우 리 는 하나의 교체 기 를 제공 하면 클래스 의 데이터 구 조 를 옮 겨 다 닐 수 있 습 니 다.컴 파일 러 가 교체 기 를 감지 하면 IEnumerable 인터페이스의 Current, MoveNext, Dispose 방법 을 자동 으로 생 성 합 니 다.교체 기 코드 는 yield return 문 구 를 사용 하여 모든 요 소 를 순서대로 되 돌려 줍 니 다.yield break 는 교 체 를 중단 합 니 다.yield return 구문 에 도착 하면 현재 교체 되 는 위 치 를 저장 하고 다음 에 교체 기 를 호출 할 때 이 위치 에서 실 행 됩 니 다.
다음 예제 에서 교체 블록 (여 기 는 방법 Power(int number, int power) 에서 yield 문 구 를 사 용 했 습 니 다.Power 방법 을 호출 할 때, 그것 은 숫자 멱 을 포함 하 는 매 거 진 대상 을 되 돌려 줍 니 다.Power 방법의 반환 유형 은 IEnumerable (교체 기 인터페이스 형식) 입 니 다.
  • // yield-example.cs

  • using System;
  • using System.Collections;

  • public class List
  • {

  •     public static IEnumerable Power(int number, int exponent)
  •      {

  •         int counter = 0;
  •         int result = 1;

  •         while (counter++ < exponent)
  •          {

  •              result = result * number;
  •              yield return result;

  •          }
  •      }
  •     static void Main()

  •      {
  •         // Display powers of 2 up to the exponent 8:

  •         foreach (int i in Power(2, 8))
  •          {

  •              Console.Write("{0} ", i);
  •          }

  •      }
  • }

  •  yield    키워드 yield: 교체 블록 에서 매 거 진 대상 에 게 값 을 제공 하거나 교체 종료 신 호 를 보 내 는 데 사 용 됩 니 다. 교체 블록 에는 두 개의 특수 한 문구 가 있 습 니 다.          ●yield return ;          ●yield break;
    교체 블록    교체 기 블록 은 하나 이상 의 yield 문 구 를 가 진 코드 블록 입 니 다. 다음 세 가지 유형의 코드 블록 중 하 나 는 모두 교체 기 블록 일 수 있 습 니 다.          ■ 방법 주체          ■ 액세스 주체          ■ 연산 자 주체
        yield 문 구 는 교체 기 블록 에 만 나타 날 수 있 습 니 다. 이 블록 은 방법, 연산 자 또는 방문 기의 몸 으로 만 사용 할 수 있 습 니 다. 이러한 방법, 연산 자 또는 방문 기의 몸 은 다음 과 같은 제약 을 받 습 니 다.        ■ 안전 하지 않 은 블록 은 허용 되 지 않 습 니 다.        ■ 방법, 연산 자, 접근 기의 인 자 는 ref 나 out 일 수 없습니다.        ■ yield 문 구 는 익명 의 방법 에 나타 나 면 안 됩 니 다.        ■ yield return 문 구 는 catch 블록 이나 하나 이상 의 catch 자 구 를 포함 한 try 블록 에 나타 나 면 안 됩 니 다.
        yield 문장의 교체 블록 은 IEnumerator 와 IEnumerable 두 가지 대상 을 만 들 수 있 습 니 다.    ★ IEnumerable 대상:        public IEnumerable GetInts()        {            yield return 0;            yield return 1;            yield return 2;            yield return 3;        }    사용 예시: foreach 문장 에 직접 작용        foreach (int i in GetInts())        {            Console.WriteLine(i.ToString());        }    ★ IEnumerator 대상:        public IEnumerator < int > GetEnumerator () / / 주의 방법 명        {            yield return 0;            yield return 1;            yield return 2;            yield return 3;        }    예제 1: foreach 문 구 를 직접 사용 할 수 없습니다. 교체 기 를 가 져 오 는 방법 명 은 MyEnumerator () 와 같이 임의로 선택 할 수 있 습 니 다.        Integers ints = new Integers (); / Integers 는 GetEnumerator () 방법 이 있 는 클래스 입 니 다.        IEnumerator enumerator = ints.GetEnumerators();        while (enumerator.MoveNext())        {            Console.WriteLine(enumerator.Current.ToString());        }    예제 2: foreach 문 구 를 사용 할 수 있 지만 방법 이 있 는 클래스 는 foreach 문 구 를 사용 하고 GetEnumerator 를 교체 기 를 가 져 오 는 방법 명 으로 사용 해 야 합 니 다.        Integers ints = new Integers (); / Integers 는 GetEnumerator () 방법 이 있 는 클래스 입 니 다.        foreach (int i in ints)        {            Console.WriteLine(i.ToString());        }
    PS: 거의 모든 yield return 과 직접 return list 에 대한 테스트 결 과 는 yield return 이 더 느리다 는 것 을 알려 줍 니 다. 하지만 yield return 을 진정 으로 알 게 되면 대부분의 경우 yield return 을 선택 할 것 이 라 고 믿 습 니 다.

    좋은 웹페이지 즐겨찾기