델리게이트는 대리자라는 뜻으로, 메소드에 대한 참조 변수를 만들기 위해 사용한다.
이를 통하여 메소드를 매개변수로 넘겨 줄 수 있다.
delegate int MyDelegate(int a, int b)
int Plus(int a, int b)
{
return a + b;
}
void Start()
{
MyDelegate del = Plus;
print(del(1, 2));
}
앞서 포스팅한 람다식을 사용하여
MyDelegate Plus = (int a, int b) => return a + b;
이런식으로도 사용 가능하다.
Action과 Func은 C# 버전이 올라가면서 편의성을 위해 프로그래머가 일일이 delegate를 정의하지 않아도 되게 C# 내부적으로 정의하고 있는 대리자이다. 때문에 사용자가 delegate를 작성하지 않고도 바로 메소드를 참조할 수 있다.
Action은 인자만 존재하는 delegate, func은 인자와 결과 값이 모두 존재하는 delegate이다.
delegate int MyDelegate(int a, int b)
int Plus(int a, int b)
{
return a + b;
}
void Start()
{
MyDelegate del = Plus;
print(Plus(3, 5));
}
void Plus_Action(int a, int b)
{
print(a + b);
}
int Plus_Func(int a, int b)
{
return a + b;
}
void Start()
{
Action<int, int> act = Plus_Action;
Func<int, int, int> func = Plus_Func;
act(1, 2);
print(func(2, 3));
}
Func는 반드시 리턴 타입이 존재한다.
리턴 타입은 Generic 폼 내에, 즉 템플린 파라미터 안에 존재한다. <>안에 들어있는 n개의 형식 중 마지막은 출력 형식이고 나머지는 입력 형식이다.
따라서 람다식의 왼쪽에는 n-1개의 변수가 들어가고 오른쪽에는 1개의 반환값이 들어간다.
Func func<int, int> = (int a) => return a;
Action은 Func와 다르게 리턴 타입이 존재하지 않는다.
Action action<int> = (int a) => print(a);