delegate는 클래스의 필드나 속성에 사용될 수 있다
using System.Windows.Forms;
namespace MySystem
{
class MyArea : Form
{
public MyArea()
{
// 이 부분은 무시(무명메서드 참조)
this.MouseClick += delegate { MyAreaClicked(); };
}
public delegate void ClickDelegate(object sender);
// Delegate 필드
public ClickDelegate MyClick;
// 필드 대신 Delegate 속성으로도 가능
// public ClickDelegate Click { get; set; }
// MyArea가 클릭되면 아래 함수가 호출된다고 가정
void MyAreaClicked()
{
if (MyClick != null)
{
MyClick(this);
}
}
}
class Program
{
static MyArea area;
static void Main(string[] args)
{
area = new MyArea();
area.MyClick = Area_Click;
area.ShowDialog();
}
static void Area_Click(object sender)
{
area.Text = "MyArea 클릭!";
}
}
}
C# delegate는 여러 개의 메서드들을 할당하는 것이 가능하다
+= 연산자를 사용하면 메서드를 게속 delegate에 추가하게 되는데, 내부적으로 .NET MulticastDelegate 클래스에서 이 메서드들의 리스트(InvocationList)를 관리하게 된다
복수개의 메서드들이 한 delegate에 할당되면, 이 delegate가 실행될 때 InvocationList로부터 순서대로 메서드를 하나씩 가져와 실행한다
class Program
{
static MyArea area;
static void Main(string[] args)
{
area = new MyArea();
// 복수개의 메서드를 delegate에 할당
area.MyClick += Area_Click;
area.MyClick += AfterClick;
area.ShowDialog();
}
static void Area_Click(object sender)
{
area.Text += " MyArea 클릭! ";
}
static void AfterClick(object sender)
{
area.Text += " AfterClick 클릭! ";
}
}