25 delegate(3)

vencott·2021년 6월 2일
0

C#

목록 보기
25/32

delegate 사용 시 주의점

  • += 연산자 대신 = 연산자를 사용할 경우 InvocationList에 있는 모든 메서드를 지워버리고 새로 할당하는 메서드만 리스트에 추가
  • delegate는 해당 클래스 내부에서 뿐만 아니라 외부에서도 누구든지 메서드를 호출하듯 해당 delegate를 호출할 수 있다
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);
}

event

위와 같은 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 클릭! ";      
      }
   }
}

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

profile
Backend Developer

0개의 댓글