ProgramingTip

Func의 차이점은 무엇입니까

bestdevel 2020. 11. 15. 11:36
반응형

Func의 차이점은 무엇입니까 그리고 대리인?


나는 두 가지 형태로 델리게이트를 볼 수 있습니다.

A. Func<string, string> convertMethod = lambda 

B. public delegate string convertMethod(string value);

이 둘의 실제 차이점이 무엇인지 확실하지 않습니다. 둘 다 대의원입니까? 첫 번째는 람다를 사용하고 두 번째는 실제로 작업을 수행하는 방법이 될 것이라고 생각합니다. 나도 혼란 스러울 수 있습니다.


우선, 두 가지 예는 완전히 제거의 두 가지 작업을 수행합니다. 첫 번째는 일반 대리자 변수를 선언하고 여기에 값을 할당하는 것 두 번째는 delegate형식을 정의하는 입니다. 더 완벽하게 귀하의 예는 다음과 가변합니다.

public static class Program
{
    // you can define your own delegate for a nice meaningful name, but the
    // generic delegates (Func, Action, Predicate) are all defined already
    public delegate string ConvertedMethod(string value);

    public static void Main()
    {
        // both work fine for taking methods, lambdas, etc.
        Func<string, string> convertedMethod = s => s + ", Hello!";
        ConvertedMethod convertedMethod2 = s => s + ", Hello!";
    }
}

그러나 요점은 Func<string,string>둘 다 delegate string convertMethod(string)메서드, 익명 메서드 또는 람다 식이든 동일한 메서드 정의를 보유 할 수 있습니다.

색칠하는 상황에 따라 늘어서 있습니다. 대리자가 취하고 반환하는 것에 의해 더 많이 정의되고 일반 대리자가 완벽합니다. 당신이 원하는 생성 경우 대리자 (단순 넘어 그 대리인이해야 할 일을 더 정의하는 특별한 이름이하기 Action, Predicate등) 한 후 자신의 대리인이 항상 옵션입니다.


당신이 가지고있는 코드 샘플은 약간 스럽기 때문에 제가 시도하고 정리해 보겠습니다. 다음 두 항목은 대리자 선언입니다. 항상 delegate키워드를 포함하여 쉽게 사용할 수 있습니다.

public delegate TReturn Func<TArg, TReturn>(Targ value);
public delegate string convertMethod(string value);

이 코드 줄은 대리자에 입력 된 로컬에 값을 할당합니다.

Func<string, string> local = lambda;

위의 코드는 람다 만 사용하는 것입니다. 값은 호환 가능한 메서드 그룹 또는 다른 대리자 값일 수도 있습니다.

주목해야 할 또 하나의 항목은 Func<string, string>

convertMethod둘 다 동일한 서명을 가진 대리자 이지만 해당하는 값은 변환 할 있는 것 입니다. 예를 들어 다음은 불법입니다.

Func<string, string> local1 = ...;
convertMethod local2 = local1; // Error!!!

에서 MSDN ,

2.0 이전 버전의 C #에서 대리 선언하는 유일한 방법은 명명 된 메서드를 사용하는 것입니다. C # 2.0은 익명 메서드를 도입하고 C # 3.0 이상에서는 람다식이 인라인 코드를 작성하는 기본 방법으로 익명 메서드를 대체합니다.

익명 메서드가 람다 식에서 사용 가능한 기능을 제공하는 경우가 있습니다. 익명 메소드를 사용하면 다음 변수 목록을 생략 할 수 있습니다. 즉, 익명 메서드를 다양한 서명을 가진 대리자로 변환 할 수 있습니다.

대리자 키워드 대 람다 식 에 대한이 SO 답변에 관심이있을 수도 있습니다 .

또한 MSDN에는 Lambda Expressions에 대한 좋은 기사가 있습니다 .

delegate int del(int i);
static void Main(string[] args)
{
    del myDelegate = x => x * x;
    int j = myDelegate(5); //j = 25
}

이전 예제에서 대리자 서명에는 int 유형의 암시 적으로 형식화 된 입력 매개 변수가 하나 있고 int를 반환합니다. 람다 식은 하나의 입력 매개 변수 (x)와 컴파일러가 암시 적으로 int 형식으로 변환 할 수있는 반환 값도 있으므로 해당 형식의 대리자로 변환 할 수 있습니다. (유형 추론은 다음 섹션에서 자세히 설명합니다.) 입력 매개 변수 5를 사용하여 대리 튼 호출하면 결과 25가 반환됩니다.


A 는 즉시 호출 할 수있는 대리자의 인스턴스를 초기화합니다. Func <string, string> 유형의 변수입니다.

B 는 대리자의 정의 (서명)를 지정합니다. 나중에 convertMethod 유형의 변수를 정의하는 데 사용할 수 있습니다 .

참고 URL : https://stackoverflow.com/questions/6818656/what-is-the-difference-between-funcstring-string-and-delegate

반응형