본문 바로가기
Study/C#

[C#][Study][기초다지기] 내장 delegate

by 스테디코디스트 2023. 9. 23.
반응형

내장 delegate

- Microsoft에서 제공하는 2종류의 내장 delegate가 있다.

- 내장 delegate를 이용해 이벤트 처리 코드를 쉽게 작성할 수 있다.

- 이벤트를 발생시킬때 규칙에 따라 필수 매개변수들을 delegate로 전달해야함

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

1) 예시 1 - 리턴값이 없는 이벤트

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace event_programming
{
    //This is Subscriber Class
    class Program
    {
        static void Main(string[] args)
        {
            AddTwoNumbers a = new AddTwoNumbers();
            
            // 이벤트에 딜리게이트 추가
            a.ev_OddNumber += EventMessage; // 바로 함수를 추가
            a.Add();
            Console.Read();
        }    
        
        // 이벤트 발생시 호출되는 함수
        static void EventMessage(object sender, EventArgs e)
        {
            Console.WriteLine("***Event Executed : This is Odd Number***");            
        }
    }
    
    //This is Publisher Class
    class AddTwoNumbers
    {
        public event EventHandler<EventArgs> ev_OddNumber;
 
        public void Add()
        {
            int result;
            result = 5 + 4;
            Console.WriteLine(result.ToString());
            
            // 결과가 홀수인 경우에만 이벤트 동작
            if((result % 2 != 0) && (ev_OddNumber != null))
            {
              ev_OddNumber(this, EventArgs.Empty); // 이벤트 발생
            }          
        }
    }
}

2) 예시 2 - 리턴값이 있는 이벤트

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace event_programming
{    
    class Program
    {
        static void Main(string[] args)
        {
            AddTwoNumbers a = new AddTwoNumbers();
            
            a.ev_OddNumber += EventMessage;
            a.Add();
            Console.Read();            
        }      
               
        static void EventMessage(object sender, OddNumberEventArgs e)
        {
            Console.WriteLine("Event Executed : {0} is an Odd Number", e.sum);            
        }
    }
 
    public class AddTwoNumbers
    {
        public event EventHandler<OddNumberEventArgs> ev_OddNumber;
 
        public void Add()
        {
            int result;
            result = 5 + 4;
            Console.WriteLine(result.ToString());       
            
            if((result % 2 != 0) && (ev_OddNumber != null))
            {
               ev_OddNumber(this, new OddNumberEventArgs(result)); //Raised Event
            }          
        }        
    }
 
    // EventArgs를 상속받아 사용자의 클래스 생성
    public class OddNumberEventArgs : EventArgs
    {
        public OddNumberEventArgs(int result)
        {
            sum = result;
        }
        public int sum { get; set; }
    }
}