모든 이벤트(event)는 특수한 형태의 Delegate이다. c# delegate 기능은 경우에 따라 잘못 사용될 소지가 있다.
예시 코드
area = new MyArea();
area.MyClick += Area_Click;
area.MyClick += AfterClick;
area.Show();
// 실수로 '=' 연산자를 사용해 MyClick은 Area_Click메서드만 갖는다.
area.MyClick = Area_Click;
// 클래스 외부에서 호출할 수 있다.
area.MyClick(null);
위의 문제점을 극복하기 위해 c# event를 사용할 수 있다.
c# event는 할당연산자(=)를 사용할 수 없고, 오직 (+=, -=)만을 사용할 수 있다. 그리고 delegate와 달리 해당 클래스 외부에서는 직접 호출할 수 없다.
class MyArea : Form
{
public MyArea()
{
// 이 부분은 당분간 무시 (무명메서드 참조)
// 예제를 테스트하기 위한 용도임.
this.MouseClick += delegate { MyAreaClicked(); };
}
public delegate void ClickDelegate(object sender);
// Event 필드
public event ClickDelegate 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;
// 이벤트 직접호출 불가하기에 에러 뜸
//area.MyClick(this);
area.ShowDialog();
}
static void Area_Click(object sender)
{
area.Text = "MyArea 클릭!";
}
static void AfterClick(object sender)
{
area.Text += " AfterClick 클릭! ";
}
}
'게임 프로그래밍 > C#' 카테고리의 다른 글
| 구조체와 클래스 차이 (0) | 2021.11.12 |
|---|---|
| 델리게이트 (0) | 2021.11.12 |
| func, Action 델리게이트 (0) | 2021.11.12 |
| Interface (0) | 2021.11.12 |
| 일반화 컬렉션 (0) | 2021.11.12 |




최근댓글