static void Main(string[] args)
{
area = new MyArea();
area.MyClick += Area_Click;
area.MyClick += AfterClick;
area.Show();
// 덮어쓰기: MyClick은 Area_Click메서드만 갖는다
area.MyClick = Area_Click;
// C# delegate는 클래스 외부에서 호출할 수 있다.
// C# event는 불가
area.MyClick(null);
}
위와 같은 delegate의 문제점들을 극복하기 위해서 특별한 형태의 delegate로서 event를 사용
event는 할당 연산자(=)를 사용할 수 없으며 오직 이벤트 핸들러 추가(+=) / 삭제(-=) 연산자 만을 사용
delegate 와는 달리 해당 클래스 외부에서는 직접 이벤트 호출 불가능
using System.Windows.Forms;
namespace MySystem
{
class MyArea : Form
{
public MyArea()
{
// 이 부분은 무시(무명메서드 참조)
this.MouseClick += delegate { MyAreaClicked(); };
}
public delegate void ClickEvent(object sender);
// event 필드
public event ClickEvent MyClick;
// 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.MyClick += AfterClick;
// 이벤트 탈퇴
area.MyClick -= Area_Click;
// Error: 이벤트 직접호출 불가
// area.MyClick(this);
area.ShowDialog();
}
static void Area_Click(object sender)
{
area.Text += " MyArea 클릭! ";
}
static void AfterClick(object sender)
{
area.Text += " AfterClick 클릭! ";
}
}
}