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 유형의 변수를 정의하는 데 사용할 수 있습니다 .
'ProgramingTip' 카테고리의 다른 글
Pandas로 가변 수의 열 처리 -Python (0) | 2020.11.15 |
---|---|
Go에서 분할을 수행하는 방법 (0) | 2020.11.15 |
varchar (MAX)가 항상 선호하는 검사? (0) | 2020.11.15 |
읽어야하는 PEP는 무엇입니까? (0) | 2020.11.15 |
C #에서 개체의 메모리 주소 (0) | 2020.11.15 |