14 이벤트

vencott·2021년 6월 2일
0

C#

목록 보기
14/32

클래스 내에 특정한 일(event)이 일어났음을 외부의 이벤트 가입자(subscriber)들에게 알려주며 일종의 필드처럼 정의된다

이벤트 핸들러

이벤트에 가입하는 subscriber는 이벤트가 발생했을 때 실행할 이벤트 핸들러를 지정해야한다

이벤트 핸들러는 이벤트에 += 연산자를 사용하여 가입하고, -= 연산자를 사용하여 삭제한다

하나의 이벤트에는 여러 이벤트 핸들러를 등록할 수 있고, 이벤트가 발생하면 등록된 모든 이벤트 핸들러들을 차례대로 호출한다

class MyButton
{
   public string Text;
   public event EventHandler Click;

   public void MouseButtonDown()
   {
      if (this.Click != null)
      {
         Click(this, EventArgs.Empty);
      }
   }
}

// 이벤트 실행
public void Run()
{
   MyButton btn = new MyButton();
   btn.Click += new EventHandler(on_Btn_Click);
   btn.Text = "Run";
}

// 이벤트 핸들러
void on_Btn_Click(object sender, EventArgs e)
{
   MessageBox.Show("Button 클릭");
}

add와 remove

클래스의 속성(Property)에서 get, set을 사용하듯 event에서 add, remove를 사용할 수 있다

필드인 _click 이벤트 안에 있는 내부 리스트(Invocation List)에 value 델리게이트를 추가하거나 삭제한다

여러 개의 델리게이트를 가지고 순서대로 호출하는 것을 멀티캐스트 델리게이트라고 하며, 델리게이트는 멀티캐스트가 디폴트이다

만약 add문에서 += 대신 =를 사용하면 기존 InvocationList의 내용을 지우고 할당된 새 value 델리게이트 하나만 추가하게 되며 이는 싱글캐스트 델리게이트이다

class MyButton
{
    private EventHandler _click; // 필드
    public event EventHandler Click // 속성
    {
        add
        {
            _click += value;
            // _click = value; // 싱글캐스트
        }
        remove
        {
            _click -= value;
        }
    }

    public void MouseButtonDown()
    {
        if (this._click != null)
        {
            _click(this, EventArgs.Empty);                                
        }
    }

    /* 속성 예제
    private string _name;
    public string Name 
    {
        get
        {
            return _name;
        }
        set
        {
            _name = value;
        }
    }
    */
}

출처: http://www.csharpstudy.com/

profile
Backend Developer

0개의 댓글