22개의 반복자
22.1 반복자 블록
반복자 블록은 순서가 지정된 값 시퀀스를 생성하는 명령문 블록입니다. 반복자 블록은 하나 이상의 항복 문으로 일반 명령문 블록과 구별됩니다.
l Yield return 문은 반복의 다음 값을 생성합니다.
l Yield Break 문은 반복이 완료되었음을 나타냅니다.
반복자 블록은 해당 함수 멤버의 반환 유형이 열거자(열거자 인터페이스 중 하나 또는 열거 가능 인터페이스 중 하나)인 경우 메서드 본문, 연산자 본문 또는 접근자 본문으로 사용할 수 있습니다.
반복기 블록은 C# 구문의 고유 요소가 아닙니다. 이는 여러 가지 방식으로 제한되며 주로 함수 멤버 선언의 의미에 영향을 미치지만 구문론적으로는 단지 명령문 블록일 뿐입니다.
반복기 블록을 사용하여 함수 멤버를 구현할 때 형식 매개변수 목록에 대해 ref 또는 out 매개변수를 지정하면 컴파일 시간 오류가 발생합니다.
반복자 블록 내의 return 문은 컴파일 시간 오류를 발생시킵니다(단, 항복 return 문은 허용됩니다).
반복자 블록에 안전하지 않은 컨텍스트(§18.1)를 포함하면 컴파일 시간 오류가 발생합니다. 반복기 선언이 안전하지 않은 컨텍스트에 포함된 경우에도 반복기 블록은 항상 안전한 컨텍스트로 정의됩니다.
22.1.1 열거자 인터페이스
열거자 인터페이스(열거자 인터페이스)[/b]는 System.Collections.IEnumerator 인터페이스이자 System.Collections.Generic.IEnumerator
22.1.2 열거 가능 인터페이스
열거 가능 인터페이스(열거 가능 인터페이스[/b])[/b]는 System.Collections.IEnumerable 인터페이스이며 System.Collections.Generic.IEnumerable< 모든 인스턴스입니다. ;T>. 이 장에서는 이러한 인터페이스를 IEnumerable 및 IEnumerable
22.1.3Yield 유형
반복자 블록은 모든 값이 동일한 유형으로 시퀀스를 생성합니다. 주어진 유형을 반복자 블록의 항복[/b] 유형(수율 유형[/b])[/b]이라고 합니다.
l 반복자 블록의 항복 유형은 일반적으로 IEnumerator 또는 IEnumerable 개체를 반환하는 함수 멤버를 구현하는 데 사용됩니다.
l 반복자 블록의 항복 유형은 일반적으로 IEnumerator
22.1.4 this 액세스
클래스 인스턴스 멤버의 반복자 블록 내에서 this 표현식은 값으로 분류됩니다. 값의 유형은 클래스 유형입니다. 이 사용법은 멤버가 호출될 때 객체에 대한 참조입니다.
구조체 인스턴스 멤버의 반복자 블록 내에서는 표현 시 변수로 분류됩니다. 변수의 유형은 이러한 방식으로 사용될 수 있는 구조 유형입니다. 이 변수는 멤버가 호출될 때 해당 구조의 복사본을 나타냅니다. 구조 인스턴스 멤버의 반복기 블록 내에서 this 변수는 구조 유형의 값 매개변수인 것처럼 동작합니다.
22.2 열거형 객체
열거자 인터페이스 유형을 반환하는 함수 멤버가 반복자 블록을 사용하여 구현되는 경우 함수 멤버를 호출해도 반복자 블록의 코드가 즉시 실행되지 않습니다. 대신 열거자 개체가 생성되어 반환됩니다. 이 개체는 반복기 블록에 지정된 코드를 캡슐화합니다. 열거자 개체의 MoveNext 메서드가 호출되면 반복기 블록의 코드가 실행됩니다. 열거자 개체에는 다음과 같은 특징이 있습니다.
l IEnumerator 및 IEnumerator
l System.IDisposable을 구현합니다.
l 인수 값(있는 경우)의 복사본으로 초기화되고 인스턴스 값이 함수 멤버에 전달됩니다.
l 이전, 실행 중, 일시 중지, 이후의 네 가지 잠재적 상태가 있으며 이전 상태 이전에 초기화됩니다.
열거자 개체는 일반적으로 반복자 명령문 블록의 코드를 캡슐화하고 열거자 인터페이스를 구현하는 컴파일러에서 생성된 열거자 클래스 인스턴스이지만 다른 구현 방법도 가능합니다. 열거자 클래스가 컴파일러에 의해 생성되면 클래스가 포함되고, 클래스는 함수 멤버를 포함하는 클래스 내에서 전용 액세스 가능성을 가지며, 클래스는 컴파일러 사용을 위해 예약된 이름을 갖게 됩니다.
열거자 개체는 여기에 지정된 것보다 더 많은 인터페이스를 구현할 수 있습니다.
다음 섹션에서는 열거형 개체에서 제공하는 IEnumerable 및 IEnumerable
열거자 개체는 IEnumerator.Reset 메서드를 지원하지 않습니다. 이 메서드를 호출하면 System.NotSupportedException 예외가 발생합니다.
22.2.1MoveNext 메소드
열거자 개체의 MoveNext 메서드는 반복기 블록의 코드를 캡슐화합니다. MoveNext 메서드를 호출하면 반복기 내에서 코드가 실행되고 열거형 개체의 Current 속성이 적절한 값으로 설정됩니다. MoveNext 메서드가 수행하는 정확한 작업은 MoveNext 메서드가 호출될 때 열거자 개체의 상태에 따라 달라집니다.
l 열거자 객체 상태가 이전인 경우 MoveNext
n을 호출하면 상태가 실행 중으로 변경됩니다.
n은 반복자 블록의 매개변수(이를 포함)를 열거자 객체가 초기화될 때 저장된 실제 매개변수 값과 인스턴스 값으로 초기화합니다.
n 실행이 중단될 때까지 반복기 블록을 처음부터 실행합니다(아래 설명 참조).
l 열거자 개체의 상태가 실행 중이면 MoveNext 호출 결과가 지정되지 않습니다.
l 열거자 개체의 상태가 일시 중단된 경우 MoveNext
n을 호출하면 상태가 실행 중으로 변경됩니다.
l 모든 지역 변수 및 매개변수(이를 포함)의 값을 반복자가 마지막으로 일시 중단(일시 중단)되었을 때의 실행 상태 값으로 복원합니다. MoveNext에 대한 이전 호출 이후 이러한 변수가 참조하는 개체의 내용이 변경되었을 수 있습니다.
n 실행을 일시 중단시킨 항복 반환 문 이후 반복기 블록의 실행을 다시 시작하고 실행이 중단될 때까지 이 상태를 계속합니다(아래 설명 참조).
l 열거자 개체의 상태가 이후인 경우 MoveNext를 호출하면 false가 반환됩니다.
MoveNext가 반복자 블록을 실행할 때 실행을 중단하는 방법에는 4가지가 있습니다. 즉, Yield return 문을 통해, Yield Break 문을 통해 반복기 블록의 끝점에 도달하고 예외가 발생하여 외부로 전파됩니다. 반복자 블록.
l Yield return 문(§22.4)이 발생하면 다음이 발생합니다.
n 문에 제공된 표현식이 평가되고 암시적으로 항복 유형으로 변환되며 Current 속성에 할당됩니다. 열거 객체.
n 반복자 본문의 실행이 일시 중지됩니다. 모든 지역 변수 및 매개변수(이를 포함)의 값은 항복 반환 문의 위치와 마찬가지로 저장됩니다. Yield return 문이 하나 이상의 try 블록 내에 있는 경우 연결된 finally 블록은 지금 실행되지 않습니다.
n 열거자 개체의 상태가 일시 중단으로 변경됩니다.
n MoveNext 메서드는 호출자에게 true를 반환하여 반복자가 다음 값으로 성공적으로 진행했음을 나타냅니다.
l Yield Break 문을 만나면 다음과 같은 일이 발생합니다.
n Yield Break 문이 하나 이상의 try 블록 내에 있으면 이와 연결된 finally 문이 실행됩니다.
n 열거자 객체의 상태가 after로 변경됩니다.
n MoveNext 메서드는 호출자에게 false를 반환하여 반복이 완료되었음을 나타냅니다.
l 반복자 블록의 끝점을 만나면 다음과 같은 일이 발생합니다.
n 열거자 객체의 상태가 after로 변경됩니다.
n MoveNext 메서드는 호출자에게 false를 반환하여 반복이 완료되었음을 나타냅니다.
l 예외가 발생하고 반복기 블록 외부로 전파되면 다음이 발생합니다.
n 예외 전파로 인해 반복자 블록 내에서 적절한 finally 블록이 실행됩니다.
n 열거자 객체의 상태가 after로 변경됩니다.
n MoveNext 메소드 호출자에 대해서는 예외 전파가 계속됩니다.
22.2.2 현재 속성
열거자 객체의 현재 속성은 반복자 블록의 항복 반환 문의 영향을 받습니다.
열거자 개체가 일시 중지된 상태인 경우 Current 값은 MoveNext가 마지막으로 호출되었을 때 설정된 값입니다. 열거자 개체가 이전, 실행 중 또는 이후 상태인 경우 Current에 액세스한 결과는 지정되지 않습니다.
객체 유형이 아닌 항복 유형 반복기 블록의 경우 열거자 객체의 IEnumerable 구현을 통해 Current에 액세스하여 얻은 구현은 열거자 객체의 IEnumerator
22.2.3 파기방법
Dispose 메서드는 열거자 개체의 상태를 after로 설정하여 반복 결과를 정리합니다.
l 열거자 개체의 상태가 이전인 경우 Dispose를 호출하면 상태가 이후로 변경됩니다.
l 열거자 개체의 상태가 실행 중인 경우 Dispose를 호출한 결과는 지정된 것입니다.
l 열거자 개체의 상태가 일시 중지된 경우 Dispose를 호출하면
상태가 실행 중으로 변경됩니다.
n 마지막으로 실행된 항복 반환 문이 항복 브레이크 문인 것처럼 finally 블록을 실행합니다. 여기에서 예외가 발생하고 반복기 본문 외부로 전파되면 열거자 개체의 상태는 after로 설정되고 예외는 Dispose 메서드 호출자에게 전파됩니다.
n은 상태를 after로 변경합니다.
l 열거자 개체의 상태가 이후인 경우 Dispose를 호출해도 효과가 없습니다.
22.3 열거 가능한 객체
열거 가능한 인터페이스 유형을 반환하는 함수 멤버가 반복자 블록을 사용하여 구현되는 경우 함수 멤버를 호출해도 반복자 블록 코드가 즉시 실행되지 않습니다. 대신, 열거 가능한 객체([/b]열거 가능한 객체[/b])[/b]가 생성되어 반환됩니다. 열거 가능 개체의 GetEnumerator 메서드는 반복기 블록에 지정된 코드를 캡슐화하는 열거자 개체를 반환합니다. 열거자 개체의 MoveNext 메서드가 호출되면 반복기 블록 코드의 실행이 트리거됩니다. 열거 가능한 객체에는 다음과 같은 특징이 있습니다.
l IEnumerable 및 IEnumerable
l 인수 값(있는 경우)의 복사본으로 초기화되고 인스턴스 값을 함수 멤버에 전달합니다.
열거 가능 객체는 일반적으로 반복기 블록의 코드를 캡슐화하고 열거 가능 인터페이스를 구현하는 컴파일러에서 생성된 열거 가능 클래스의 인스턴스이지만 다른 구현도 가능합니다. 열거 가능한 클래스가 컴파일러에 의해 생성된 경우 클래스는 함수 멤버를 포함하는 클래스에 포함되며 전용 액세스 가능성과 컴파일러에서 사용하도록 예약된 이름을 갖습니다(§2.4.2).
열거 가능한 객체는 여기에 설명된 것보다 더 많은 인터페이스를 구현할 수 있습니다. 특히, 열거 가능 객체는 IEnumerator 및 IEnumerator
22.3.1 GetEnumerator 메서드
Enumerable 개체는 IEnumerable 및 IEnumerable
열거자 개체는 실제 매개변수 값으로 초기화됩니다. 열거 가능한 개체가 초기화되면 해당 인스턴스 값이 저장됩니다. 반면, 열거자 개체 함수는 §22.2에 설명되어 있습니다.
(계속)
위는 C# 2.0 사양(Iterator)(1)의 내용입니다. 더 많은 관련 내용은 PHP 중국어 홈페이지(www.php)를 참고해주세요. .cn)!