2015-02-02 2 views
2
static void Main(string[] args) 
    { 
     List<int> li = new List<int>() { 1, 20, 30, 4, 5 }; 
     GetNosLessThan5(li); 
    } 

    public static IEnumerable<int> GetNosLessThan5(List<int> numbers) 
    { 
     foreach (var v in numbers) 
     { 
      if (v < 5) 
       yield return v; 
     } 
    } 

void main의 시작 부분에 디버그 지점을 넣었습니다. f11 키를 계속 누르면 노란색 화살표가 주 기능 블록 만 덮고 디버깅이 종료됩니다. 전혀 "getnoslessthan5"기능에 도달하지 않습니다.Visual Studio 2010에서 중단 점에 도달하지 못하는 이유는 무엇입니까?

답변

5

실제로 결과를 반복하지 않으므로 GetNosLessThan5 함수의 실제 본문은 실행되지 않습니다. 컴파일러는 후드에서 반복자를 생성하지만 실제로 함수 본문을 실행하기 위해 뭔가를 실제로 열거해야합니다.

MSDN Documentation about Iterators을 참조하십시오.

반복자를 사용하여 목록 및 배열과 같은 컬렉션을 단계별로 실행할 수 있습니다.

반복기 메소드 또는 get 접근자는 컬렉션에 대해 사용자 지정 반복을 수행합니다. 반복기 메서드는 Yield (Visual Basic) 또는 yield return (C#) 문을 사용하여 한 번에 하나씩 각 요소를 반환합니다. Yield 또는 yield return 문에 도달하면 코드의 현재 위치가 기억됩니다. 다음 번에 iterator 함수가 호출 될 때 그 위치에서 실행이 다시 시작됩니다.

For Each ... Next (Visual Basic) 또는 foreach (C#) 문을 사용하거나 LINQ 쿼리를 사용하여 클라이언트 코드에서 반복기를 사용합니다.

+0

내부의 주요 내부 기능 호출에 대한 호출이 있습니까? 그래서 함수는 올바르게 실행되어야합니다. ? – callyaser

+1

@callyaser 아니요, IEnumerable을 반환하는 함수를 호출하고 있습니다. 즉, GetNosLessThan5는 "Iterating it over it"이라는 객체를 반환합니다. 그것은 ** 열거의 결과를 반환하지 않습니다 ** 당신은'.ToList' 또는 실제로 숫자를 계산하는 유사한 메소드를 호출해야 할 것입니다. '반복자'는 C#에서 약간의 컴파일러 마술입니다. –

+0

(Iterators는 실행에 비용이 많이 들거나 심지어 무한하기 때문에 최적화 기법입니다. 호출자가 실행 여부, 실행 시간 및 실행 시간을 결정해야합니다.) –

관련 문제