2016-08-04 2 views
0

내 프로젝트에 다음 코드 스 니펫이 있습니다. 나는 람다 식을 처음 사용한다. 나는 그것에 대해 약간의 생각을 가지고 있으며 또한 사용을 시작했습니다. 하지만 아래 코드가 어떻게 작동하는지 이해할 수 없습니다. 특별히주어진 코드 스 니펫에서 작동하는 람다 식 표현식은 무엇입니까

NotifyIntrenal(notification, callback, changedTypes => .. 

지금 여기 changedTypes 방법 NotifyIntrenal의 매개 변수 중의 하나이다. 우리는 이성적인 방법을 사용하여 그 가치를 도출합니다.

코드를 볼 경우 changedTypes에 값을 지정하지 않으므로 코드 if (changedTypes == null)은 이 항상 true이어야합니다. 하지만 디버깅 할 때는 그렇지 않습니다.

누군가가 나를 어떻게 설명 할 수 있습니까?

private void Notify(Notification notification) 
{ 
    var nameDto = GetNameDto(); 
    foreach (var subscription in _subscriptionsDictionary) 
    { 
     var callback = subscription.Key; 
     var subscribedTypes = subscription.Value; 
     NotifyIntrenal(notification, callback, changedTypes => 
      { 
       if (changedTypes == null) 
        return subscribedTypes; 

       if (!changedTypes.Any()) 
        return subscribedTypes; 

       return changedTypes.Intersect(subscribedTypes); 
      }, nameDto); 
    } 
} 

감사 & 감사

+0

람다 식은 * 함수 *이고, changedType은 (아마도 NotifyIntrenal 내에서) 호출자가 제공 한 인수입니다. [this duplicate] (http://stackoverflow.com/questions/167343/c-sharp-lambda-expressions-why-should-i-use-them)를 참조하십시오. –

+2

NotifyIntrenal 코드 추가 – Steve

+0

위의 람다에 무슨 일이 일어나는지 알지만 실제로 동일한 코드를 메서드에 두는 것의 이점이 있습니까? 그 외의 것이 없다면 코드 클리너를 만드는 것처럼 보일 것입니다. 또는 그 문제에 대해, NotifyInternal() 함수는 그 안에 동일한 논리를 가질 수 있습니다. 이런 방식으로 성능 이점이 있습니까? – jpaugh78

답변

0

changedTypes하지 NotifyIntrenal을 위해, 당신의 익명 방법에 대한 paremeter입니다. 후자의 경우 으로 익명 메소드를 호출하고 (필요한 경우) 매개 변수를 적절히 채 웁니다. 귀하의 경우 익명 메서드는 IEnumerable<MyType>을 반환하고 IEnumerable<MyType>을 반환합니다.

NotifyIntrenal(string arg1, string arg2, Func<IEnumerable<MyType>, IEnumerable<MyType>> func) { 
    // do something 

    var list = new List<MyType> { ...} 
    // execute the delegate with the list 
    IEnumerable<MyType> result = func(list); 
} 

그래서 실제로 changedTypes하지 에 주어진NotifyIntrenal에서 제공 입니다. 메서드 내에서 해당 인수를 만드는 방법은 당신에게 달려 있습니다.

+0

현재 작성된 'func'에는 매개 변수가 없습니다. 아마도'Func , IEnumerable >'을 원할 것입니다. –

+0

고마워. 알았어. – App

3

changedTypes하지NotifyInternal에 인수입니다. 익명 메소드의 경우 매개 변수입니다.
전체 방법은 NotifyInternal에 대한 인수입니다.

이 람다 내부의 코드는이 시점에서 실행되지 않습니다. NotifyInternal의 어떤 행이이라면 그 행이 실행됩니다.

void NotifyInternal(Notification notification, Callback callback, Func<IEnumerable<Type>, IEnumerable<Type>> function, string nameDto) 
{ 
    // ... some code 

    // execute the lambda 
    var result = function(mychangedtypesvariable); 

    // ... more code 
} 

만 다음 람다 내부 코드 패스 인자 (즉, 예에서 mychangedtypesvariable)를 사용하여 실행된다 : 따라서 익명의 방법을 실행 NotifyInternal 코드 라인이 있어야한다. 이 값이 null의 경우, 보이는 스 니펫으로부터 결정할 수 없습니다.