event

클래스나 개체에 특정 상황이 발생할 때 이벤트를 통해 알려 줄수 있다.

이벤트를 보내거나 발생시키는 클래스를 게시자(publisher)라고 한다.

이벤트를 받거나 처리 하는 클래스를 구독자(subscriber)라고 한다.

GUI나 스레드 동기화에 사용된다.

.Net Framework 클래스 라이브러리에서 이벤트는 EventHandler 대리자 및 EventArgs 기본 클래스를 기반으로 한다.

using System;

public class Button
{
    
public delegate void ClickHandler(object sender, EventArgs e);  // 1. 델리 게이트 선언  

    public event ClickHandler Click; // 2.  이벤트 선언     

 

protected void OnClick()     // 3. 인스트스 존재 확인후 실행
{
     if(Click != null)
          Click(this, null);     
}

    public void SimulateClick()
    {
        OnClick();
    }
}

class Play
{
    
public void ButtonHandler(object sender, EventArgs e)  // 4. subscriber는 델리게이트와 시그너쳐를 일치 시킴   
    {
        Console.WriteLine("Button clicked");
    }
}

class Test
{
    public static void Main()
    {
        Button button = new Button();
        Play   play = new Play();

       button.Click += new Button.ClickHandler(play.ButtonHandler);  // 5. +=, -= 연산자를 사용하여 메쏘드를 이벤트에 연결     

        button.SimulateClick();
    }
}

여기서 publisher는 button.SimulateClick()
           subscriber는 Play.ButtonHandler()

 

1. 델리 게이트 선언

델리 게이트는 MSDN의 .Net Framework 지침에 따라 다음과 같이 선언한다.

[.Net Framwork에서 지원하는 EventHandler 대리자]

public delegate void EventHandler(object sender, EventArgs e);

2. 이벤트 선언
델리게이트 변수 정의에 제한자 다음에 event라는 문을 추가한다.

3. 인스턴스 존재 확인후 실행
이벤트 인스턴스가 초기화 되었는지 확인후 실행한다.

4. subscriber는 델리게이트와 시그너쳐를 일치 시킴
.Net의 GUI를 사용 할려면 EventHandler와 시그너쳐를 일치 시킨다.

5. +=, -= 연산자를 사용하여 메쏘드를 이벤트에 연결
그냥 델리게이트 인스턴스는
button.click = new Button.ClickHandler(play.ButtonHandler)와 같이 해도 에러가 나지 않는다.
event가 들어간 델리게이트 인스턴스는
button.click += new Button.ClickHandler(play.ButtonHandler)처럼 += , -= 이용해 인스턴스를 초기화 한다.

GUI에 사용되는 델리게이트와 이벤트의 여기서 확장된다.


[참고]

http://msdn2.microsoft.com/ko-kr/library/awbftdfh(VS.80).aspx

http://msdn2.microsoft.com/ko-kr/library/w369ty8x(VS.80).aspx  (.Net Framework 지침을 따른 이벤트 게시)