메서드의 파라미터로 데이터(기본 타입이나 객체)가 아닌 메서드를 전달
Delegate는 이렇게 메서드를 다른 메서드로 전달할 수 있도록 하기 위해 만들어졌다
메서드의 입력 파라미터로 피호출자에게 전달될 수 있을 뿐만 아니라 메서드의 리턴값으로 호출자에게 전달될 수도 있다
// 정의
delegate int MyDelegate(string s);
// 사용
void Run(MyDelegate method) { ... }
델리게이트 정의는 마치 메서드 선언문처럼 보이나 사실 내부적으로 컴파일러에 의해 특별한 클래스로 변환된다
즉, 델리게이트는 결국 클래스이고 내부적으로 복잡한 부분을 숨기고 사용자가 메서드 선언문 처럼 간단하게 사용할 수 있게 설계된 것이다
델리게이트가 정의된 후에는 new를 써서 델리게이트 객체를 생성하고 이를 파라미터로 전달한다
// int StringToInt(string s) { ... }
MyDelegate m = new MyDelegate(StringToInt);
Run(m);
전달된 델리게이트로부터 실제 메서드 호출
i = m.Invoke("123");
i = m("123");
예제
class Program
{
static void Main(string[] args)
{
new Program().Test();
}
// 정의
delegate int MyDelegate(string s);
void Test()
{
// 생성
MyDelegate m = new MyDelegate(StringToInt);
// 메서드로 전달
Run(m);
}
// 델리게이트 대상이 되는 메서드
int StringToInt(string s)
{
return int.Parse(s);
}
// 델리게이트를 전달 받는 메서드
void Run(MyDelegate m)
{
// 델리게이트로부터 메서드 실행
int i = m("123");
Console.WriteLine(i);
}
}