24 delegate(2)

vencott·2021년 6월 2일
0

C#

목록 보기
24/32

delegate 필드 / 속성

delegate는 클래스의 필드나 속성에 사용될 수 있다

using System.Windows.Forms;

namespace MySystem
{
   class MyArea : Form
   {
      public MyArea()
      {
         // 이 부분은 무시(무명메서드 참조)
         this.MouseClick += delegate { MyAreaClicked(); };
      }

      public delegate void ClickDelegate(object sender);

      // Delegate 필드
      public ClickDelegate MyClick;

      // 필드 대신 Delegate 속성으로도 가능
      // public ClickDelegate Click { get; set; }

      // 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.ShowDialog();
      }

      static void Area_Click(object sender)
      {
         area.Text = "MyArea 클릭!";
      }
   }
}

Multicast delegate

C# delegate는 여러 개의 메서드들을 할당하는 것이 가능하다

+= 연산자를 사용하면 메서드를 게속 delegate에 추가하게 되는데, 내부적으로 .NET MulticastDelegate 클래스에서 이 메서드들의 리스트(InvocationList)를 관리하게 된다

복수개의 메서드들이 한 delegate에 할당되면, 이 delegate가 실행될 때 InvocationList로부터 순서대로 메서드를 하나씩 가져와 실행한다

class Program
{
   static MyArea area;

   static void Main(string[] args)
   {
      area = new MyArea();

      // 복수개의 메서드를 delegate에 할당
      area.MyClick += Area_Click;
      area.MyClick += AfterClick;

      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개의 댓글