2017-12-27 40 views
1

C# 7의 새로운 기능과 특히 로컬 메소드를 실험하고있었습니다. 나는 Linq Where Operator를 썼다.C# 7 Local Methods에서 새로운 일반 매개 변수를 다시 도입하는 것이 좋습니다.

로컬 메서드로 반복자 블록을 구현했습니다. 실제로 로컬 메서드는 비동기 메서드 및 반복자에 대한 완벽한 솔루션이라고 말하는 기사를 읽었습니다.

두 구현 사이에 차이점이 있는지 궁금한데 어느 것이 가장 좋지 않은가요?

먼저 구현 : 여기에

나는 ... 매개 변수에 대한 로컬 방법, 새 이름에 대한 새로운 제네릭 형식 매개 변수를 도입

public static IEnumerable<TSource> Where<TSource> (this IEnumerable<TSource> source, Func<TSource, bool> predicate) { 
    if(source == null) throw new ArgumentNullException(nameof(source)); 
    if(predicate == null) throw new ArgumentNullException(nameof(predicate)); 
    return WhereIterator(source, predicate); 

    IEnumerable<TSequence> WhereIterator<TSequence> (IEnumerable<TSequence> localSource, Func<TSequence, bool> localPredicat) { 
     foreach(TSequence item in localSource) { 
      if(localPredicat(item)) { 
       yield return item; 
      } 
     } 
    } 
} 

두 번째 구현 :

새로운 일반 매개 변수가 없으며 새로운 p가 없습니다. arameters는 로컬 메서드가 포함 된 메서드의 변수를 캡처 할 수 있기 때문에.

public static IEnumerable<TSource> Where<TSource> (this IEnumerable<TSource> source, Func<TSource, bool> predicate) { 
    if(source == null) throw new ArgumentNullException(nameof(source)); 
    if(predicate == null) throw new ArgumentNullException(nameof(predicate)); 
    return WhereIterator(); 

    IEnumerable<TSource> WhereIterator() { 
     foreach(TSource item in source) { 
      if(predicate(item)) 
       yield return item; 
      } 
     } 
    } 
} 
+2

WhereIterator가 필요한 이유가 전혀 없습니다. 당신은 그것을 가질 수없고, Where 메서드에서 foreach 할 수 있습니다. – rokkerboci

+0

디 컴파일 된 소스 [여기] (https://sharplab.io)를 확인할 수 있습니다. 해당 기능을 작성하고 오른쪽 창에 결과를 확인하십시오. –

+0

나는 열의 인수 유효성 검사가 필요합니다 :) WhereIterator 메서드를 사용하지 않으면 인수 유효성 검사가 느리게 수행됩니다. 그래서 로컬 메서드로 반복자를 구현했습니다. –

답변

2

두 번째 구현이 더 좋습니다. 가장 큰 차이점은 두 번째 구현은 자신을 반복에서 당신을 해방, 암시 적으로 매개 변수를 캡처하는 것입니다 :

  • 매개 변수 유형을 지정
  • 지정하는 매개 변수의 이름,
  • 하는 함수에 인수를 전달할 때.

반복을 피하는 것은 매우 중요한 프로그래밍 연습이므로 두 번째 구현을 선호해야합니다.

+1

@IvanStoev 네가 맞아,이 말이 완벽 해. 코멘트 주셔서 감사합니다! – dasblinkenlight

+0

정확 하 게, 우리는 열심히 인수 유효성 검사가 필요합니다. 이것이 내가 처음에 지역 방법을 사용한 주된 이유입니다. 필자는 개인 정적 메서드를 사용하여 반복기 블록을 구현했지만 이전에는 지역 메서드가 있으므로 이제는 반복기 블록에서 Linq 확장 메서드를 구현하는 클래스를 유지하는 데 도움이되므로 더 나은 방법입니다. 간단히 말해서 iterator 블록은 클래스에서 Linq 연산자 메서드로 이동하는 데 도움이되었습니다.이 메서드는 해당 메서드 내에서만 사용되기 때문에. –

+0

하지만 지금은 혼란 스럽습니다.내 질문은 간단합니다 : 로컬 메서드가 메서드를 둘러싼 외부 변수를 캡처 할 수 있다는 사실을 사용하여 반복기 블록을 구현해야합니까, 아니면이를 무시하고 새로운 인수 형식 및 매개 변수를 도입해야합니까? –