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
대리인을 만드는 것은 항상 선택사항입니다.
당신이 가지고 있는 코드 샘플이 좀 헷갈리기 때문에 제가 정리해 보겠습니다.다음 2개 항목은 딜러 선언입니다.이들은 항상 다음을 포함하기 때문에 발견하기 쉽습니다.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에는 람다 식에 대한 좋은 기사가 있습니다.
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
'it-source' 카테고리의 다른 글
튜플 대신 목록 출력이 있는 Zip (0) | 2023.05.11 |
---|---|
UTC/GMT 시간을 현지 시간으로 변환 (0) | 2023.05.11 |
ASP.NET 2.0 - app_offline.htm 사용방법 (0) | 2023.05.11 |
Angular의 일부 항목으로 반복을 제한하려면 어떻게 해야 합니까? (0) | 2023.05.11 |
Heroku "psql: FATAL: 나머지 연결 슬롯은 복제되지 않은 슈퍼 사용자 연결을 위해 예약되었습니다." (0) | 2023.05.06 |