2017-11-16 2 views
4

이것이 더 많은 이유입니다. 여기 간다.C# 7.0의 로컬 함수가 foreach 또는 루프와 다른 점은 무엇입니까?

C# 7.0에는 "로컬 기능"이라는 새로운 기능이 추가되었습니다. 다음은 코드 스 니펫입니다.

public int Fibonacci(int x) 
{ 
    if (x < 0) throw new ArgumentException("Less negativity please!", nameof(x)); 
    return Fib(x).current; 

    (int current, int previous) Fib(int i) 
    { 
     if (i == 0) return (1, 0); 
     var (p, pp) = Fib(i - 1); 
     return (p + pp, p); 
    } 
} 

내가 이해하지 못하는 것은 동일한 방법에 대한 재귀 호출입니다. 우리는 정상적인 foreach로 이것을 쉽게 달성 할 수 있습니다. 그렇다면 왜 지역적 기능인가.

MSDN는 반복자로 구현

방법은 일반적으로 열심히 호출시 인수를 확인하기위한 비 반복자 래퍼 방법이 필요했다. (반복기 자체는 MoveNext가 호출 될 때까지 실행되지 않습니다.)

개념을 이해하는 데 도움이 필요합니다.

+4

로컬 함수를 사용하여 모든 종류의 작업을 수행 할 수 있습니다. 재귀적일 필요는 없습니다. –

+0

예 @ZoharPeled, 재귀에만 국한되지만이 예제를 사용한 이유는 무엇입니까? 그냥 궁금해서. – pordi

+0

'Fibonacci'라는 함수는 입력을 제어하는 ​​데 사용됩니다. 'Fib' imho라는 로컬 함수는 로직의 복잡한 코드를 캡슐화하는데 사용됩니다.이 경우에는 유효성 검사를 거치지 않고 재귀 호출을 사용합니다. 당신은 'Fib'을'로컬 기능이라는 확실성 '없이 호출 할 수 없습니다. – bradbury9

답변

6

동일한 메소드에 대한 재귀 호출. 우리는 쉽게 다른 두 가지입니다 정상 foreach는

에이를 수 : 꼬리 재귀 (방법은 방법 자체의 끝에서 자신을 호출) 또는 컬렉션을 반복. 항상 교환 가능한 것은 아니지만 동일한 결과를 얻는 데 사용될 수 있습니다.

로컬 함수있어서 본체 한정 범위와 클래스있어서,이 선언된다 지나지 않는다.

로컬 재귀 함수보다 많은 유용하다. 여러 블록에서 반복 코드를 방지하는 쉬운 방법입니다.

+0

"컬렉션 반복"이 재귀라고 생각하지 않습니다. 꼬리 재귀는 단지 "스스로를 호출하는 메서드"가 아닙니다. – Evk

+0

@ Evk 동의합니다. 나는 이것을 설명하는 더 좋은 방법을 찾고있었습니다. 제안에 개방. 바라기를 편집하면 더 좋게됩니다. –

+0

"로컬 함수는 클래스 메서드로 선언 된 메서드 본문으로 범위가 제한된 클래스 메서드입니다." - C#의 관점에서 볼 때, 이는 하나의 방법 이상입니다. 람다가 이미 할 수 있었던 것처럼, 지역 함수는 또한 포함 함수의 지역 변수에 접근 할 수 있습니다. CLR 레벨에서는 물론 여전히 메소드로 변환됩니다. – hvd

관련 문제