델리게이트라는 단어가 가진 뜻은 '대리자', 일을 대신 해주는 녀석을 의미한다.
delegate 반환형 델리게이트명(매개변수..);
델리게이트는 메서드의 참조를 포함한다. 즉, 메서드를 매개변수로 넘길 수 가 있다. 이때 매개변수의 데이터 형식과 반환형은 참조할 메서드의 매개변수의 데이터 형식과 반환형에 맞추어야 한다.
(참조하는 메서드가 달라진다면 델리게이트 역시 달라진다)
<예제1>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication39
{
delegate int PDelegate(int a, int b);
class Program
{
static int Plus(int a, int b)
{
return a + b;
}
static void Main(string[] args)
{
PDelegate pd1 = Plus;
PDelegate pd2 = delegate(int a, int b)
{
return a / b;
};
Console.WriteLine(pd1(5, 10));
Console.WriteLine(pd2(10, 5));
}
}
}
결과값
15
20
<예제2>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication39
{
delegate void PDelegate(int a, int b);
class Program
{
static void Plus(int a, int b)
{
Console.WriteLine("{0} + {1} = {2}", a, b, a + b);
}
static void Minus(int a, int b)
{
Console.WriteLine("{0} - {1} = {2}", a, b, a - b);
}
static void Division(int a, int b)
{
Console.WriteLine("{0} / {1} = {2}", a, b, a / b);
}
static void Multiplication(int a, int b)
{
Console.WriteLine("{0} * {1} = {2}", a, b, a * b);
}
static void Main(string[] args)
{
PDelegate pd = (PDelegate)Delegate.Combine(new PDelegate(Plus),
new PDelegate(Minus), new PDelegate(Division), new PDelegate(Multiplication));
pd(20, 10);
}
}
}
결과값
20 + 10 = 30
20 - 10 = 10
20 / 10 = 2
20 * 10 = 200
위의 코드와 같이 델리게이트를 사용한다면 하나의 델리게이트로 여러개의 메소드를 한번에 호출 할 수 있다.
프로그래밍에서 이벤트의 의미는 특정 사건이 벌어지면 알리는 메시지 라고 할 수 있다. 예를 들어 사용자가 버튼을 클릭하거나 키보드를 누를때 사용자에게 객체를 알리는 것을 이벤트 발생이라고 한다. 이벤트는 delegate를 event 한정자로 수식해서 만든다.
한정자 event 델리게이트 이름;
delegate void EventHandler(string message);
class Notifier
{
public event EventHandler EventHappened;
public void DoSomething(int number)
{
if (number == 5) // 숫자가 5일때 이벤트가 발생
{
EventHappened("이벤트 발생 : " + number.ToString());
}
}
}
static void MyHandler(string message)
{
Console.WriteLine(message);
}
static void Main(string[] args)
{
Notifier notifier = new Notifier();
notifier.EventHappened += MyHandler; // 발생시킬 이벤트를 등록
for (int i = 0; i < 10; i++)
{
notifier.DoSomething(i);
}