Func <T> () 대 Func <T> .Invoke ()


82

Func를 직접 호출하는 것과 Invoke ()를 사용하는 것의 차이점에 대해 궁금합니다. 차이가 있습니까? 첫 번째, 구문상의 설탕이며 어쨌든 Invoke ()를 호출합니까?

public T DoWork<T>(Func<T> method)
{
    return (T)method.Invoke();
}

vs

public T DoWork<T>(Func<T> method)
{
    return (T)method();
}

아니면 내가 완전히 잘못된 길을 가고 있습니까 :) 감사합니다.


답변:


111

전혀 차이가 없습니다. 두 번째는 Invoke컴파일러에서 제공 하는의 약어입니다 . 그들은 동일한 IL로 컴파일됩니다.


1
Invoke () 메서드를 해제하면 컴파일러 오류가 발생합니다. " 'System.Func <T>'형식을 'T'로 암시 적으로 변환 할 수 없습니다. 나는 .NET 4에 대해 컴파일하고있다.
Mike는

2
@ 마이크 : 당신이 놓친 더라면 그 일이 일어날 것 브라켓 뿐만 아니라 오프 - 즉, 반환하려 (T)method하기보다는 (T)method().
존 소총

@JonSkeet 그래서 여기이 사람의 잘못입니다 : social.msdn.microsoft.com/Forums/en-US/...
superlogical

4
@superlogical : 여기에 두 가지 문제가 있습니다. 첫째, 메서드를 직접 호출하는 것과 대리자를 통해 호출하는 것의 차이점에 대한 질문입니다. 대리자 형식의 변수 foo()foo.Invoke()위치 의 차이와는 다릅니다 foo. 다른 문제는 대답 이에 대해 말하는 것처럼 보이며 델리게이트 Control.Invoke를 호출하는 것과 다릅니다 Invoke.
Jon Skeet

2
@LucaCremonesi는 : 그것은 메서드 호출의 결과가 있다면, 나는 일반적으로 같은 Invoke같은, GetAction()()이상한 외모,하지만 GetAction().Invoke()괜찮아 보인다. 그러나 나는 대부분의 경우 어느 쪽이든 상관하지 않습니다.
Jon Skeet

17

Invoke는 새로운 C # 6 null 전파 연산자와 잘 작동하므로 이제 할 수 있습니다.

T result = method?.Invoke();

대신에

T result = method != null ? method() : null;

이것이 유용한 시나리오를 설명 할 수 있습니까? 교과서 사건이 사건을 일으키고 있습니다.
Gusdor

1
예를 들어 값이 지정되지 않은 경우 null이고 무시되는 기본값 (Func) 인 선택적 Func 매개 변수를 가질 수 있습니다.
Austin Salgat

1
이벤트 및 기타 멀티 캐스트 델리게이트의 일반적인 경우입니다. 일반적으로을 호출 한 후 null로 초기화되고 null이 아닌 값을 얻습니다 +=. 따라서 이벤트를 시작하고 구독이 있는지 모르는 경우 간결한 해결책은 ?.Invoke(...).
stop-cran
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.