English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
지연 실행은 표현식의 평가가 실제로 필요할 때까지 지연되는 것을 의미합니다. 불필요한 실행을 피하여 성능을 크게 향상시킵니다。
지연 실행은 어떤 메모리 집합 및 리모트 LINQ 제공자에도 적용됩니다. 예를 들어 LINQ-to-SQL, LINQ-to-Entities, LINQ-to-XML과 같은.
다음 예제를 사용하여 지연 실행을 이해해 보겠습니다:
위의 예제에서 foreach 루프를 사용하여 반복할 때 쿼리가 구현되고 실행된 것을 볼 수 있습니다. 이는 지연 실행이라고 합니다. 실제로 집합의 각 객체를 접근하고 처리할 때 LINQ가 studentList 집합을 처리합니다。
지연 실행이 항상 최신 데이터를 반환하는지 확인하려면 foreach 루프 뒤에 또 한 명의 청소년 학생을 추가하고 청소년 학생 목록을 확인하십시오:
보이는 것처럼 두 번째 foreach 루프는 다시 쿼리를 실행하고 최신 데이터를 반환합니다. 지연 실행은 매번 실행될 때 다시 계산되며, 이는불완전한 평가입니다. 이는 지연 실행의 주요 장점 중 하나입니다: 항상 최신 데이터를 제공합니다。
c#의 yield IEnumerable에 대한 사용자 정의 확장 메서드 구현은 지연 실행을 수행합니다。
예를 들어, IEnumerable에 사용자 정의 확장 메서드 GetTeenAgerStudents를 구현할 수 있습니다. 이 메서드는 모든 청소년 학생 목록을 반환합니다。
public static class EnumerableExtensionMethods { public static IEnumerable<Student> GetTeenAgerStudents(this IEnumerable<Student> source) { foreach (Student std in source) { Console.WriteLine("Accessing student {0}", std.StudentName); if (std.age > 12 && std.age < 20) yield return std; }; }; };
请注意,每当GetTeenAgerStudents()가 호출될 때마다, 우리는 컨트롤台中 학생 이름을 출력합니다。
지금부터 다음 확장 메서드를 사용할 수 있습니다:
C#:
IList<Student> studentList = new List<Student>() { new Student() { StudentID = 1, StudentName = "John", age = 13 }, new Student() { StudentID = 2, StudentName = "Steve", 15 }, new Student() { StudentID = 3, StudentName = "Bill", 18 }, new Student() { StudentID = 4, StudentName = "Ram", age = 12 }, new Student() { StudentID = 5, StudentName = "Ron", age = 21 }; }; var teenAgerStudents = from s in studentList.GetTeenAgerStudents() select s; foreach (Student teenStudent in teenAgerStudents) Console.WriteLine("학생 이름: {0}", teenStudent.StudentName);
student John에 접근 학생 이름: John student Steve에 접근 학생 이름: Steve student Bill에 접근 학생 이름: Bill student Ram에 접근 student Ron에 접근
출력에서 볼 수 있듯이, foreach 루프로 studentList를 순회하면 GetTeenAgerStudents()가 호출됩니다
따라서 이 방식으로, 다음과 같이 사용할 수 있습니다yield지연 실행의 장점을 얻기 위해 사용자 정의 메서드를 생성하는 키워드