1. foreach
C# 컴파일러는 foreach 문을 IEnumerable 인터페이스의 메서드와 속성으로 변환합니다.
foreach (Person p in persons) { Console.WriteLine(p); }
foreach 문은 다음 코드 세그먼트로 구문 분석됩니다.
GetEnumerator() 메서드를 호출하여 배열의 열거형을 가져옵니다.
while 루프에서 MoveNext()가 true를 반환하는 한 루프는 계속됩니다.
Current 속성을 사용하여 배열의 요소에 액세스합니다.
IEnumerator enumerator = persons. GetEnumerator(); while (enumerator.MoveNext()) { Person p = (Person) enumerator.Current; Console.WriteLine(p); }
2 .yield 문
Yield 문의 두 가지 형태:
yield return <expression>;yield break;
yield return 문을 사용하여 컬렉션의 요소를 반환합니다.
yield 문을 포함하는 메서드 또는 속성은 반복자입니다. 반복자는 다음 요구 사항을 충족해야 합니다.
a 반환 유형은 IEnumerable, IEnumerable
b. ref 또는 out 매개변수를 가질 수 없습니다.
yield 반환 문은 try-catch 블록 안에 있을 수 없습니다. Yield return 문은 try-finally
try { // ERROR: Cannot yield a value in the boday of a try block with a catch clause yield return "test"; } catch { } try { // yield return "test again"; } finally { } try { } finally { // ERROR: Cannot yield in the body of a finally clause yield return ""; }
yield break 문은 try 블록이나 catch 블록에 위치할 수 있지만 finally 블록에는 위치할 수 없습니다
다음 예는 다음과 같은 코드입니다. Yield return 문을 사용하여 간단한 컬렉션을 구현하고 foreach 문으로 컬렉션을 반복합니다.
using System;using System.Collections.Generic;namespace ConsoleApplication6 { class Program { static void Main(string[] args) { HelloCollection helloCollection = new HelloCollection(); foreach (string s in helloCollection) { Console.WriteLine(s); Console.ReadLine(); } } } public class HelloCollection { public IEnumerator<String> GetEnumerator() { // yield return语句返回集合的一个元素,并移动到下一个元素上;yield break可以停止迭代 yield return "Hello"; yield return "World"; } } }
yield return 문을 사용하여 다양한 방식으로 컬렉션을 반복하는 클래스를 구현합니다.
using System;using System.Collections.Generic;namespace ConsoleApplication8 { class Program { static void Main(string[] args) { MusicTitles titles = new MusicTitles(); foreach (string title in titles) { Console.WriteLine(title); } Console.WriteLine(); foreach (string title in titles.Reverse()) { Console.WriteLine(title); } Console.WriteLine(); foreach (string title in titles.Subset(2, 2)) { Console.WriteLine(title); Console.ReadLine(); } } } public class MusicTitles { string[] names = { "a", "b", "c", "d" }; public IEnumerator<string> GetEnumerator() { for (int i = 0; i < 4; i++) { yield return names[i]; } } public IEnumerable<string> Reverse() { for (int i = 3; i >= 0; i--) { yield return names[i]; } } public IEnumerable<string> Subset(int index, int length) { for (int i = index; i < index + length; i++) { yield return names[i]; } } } }
위 내용은 C#의 foreach 및 Yield 예제에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!