본문 바로가기
프로그래밍/C# (WinForms)

C# ] delegate

by eteo 2023. 5. 14.

 

 

 

 

C#의 delegate는 메서드를 참조하는 객체로 C/C++의 함수포인터와 비슷한 개념이다. C#의 메서드포인터라고 보면 된다. 이 Delegate는 이벤트 핸들러나 콜백 함수를 구현하거나, 대리자 메서드를 호출하는 등 용도로 사용할 수 있다.

 

using System;

namespace ConsoleApp2
{
    class Program
    {
        static void Main(string[] args)
        {
            MyClass mc = new MyClass();
            mc.Perform();
        }
    }

    class MyClass
    {
        // 1. delegate 선언
        private delegate void printInt2Consol(int i);

        public void Perform()
        {
            // 2. delegate 인스턴스 생성. delegate 인스턴스를 생성할 때는 반드시 호출될 메서드를 전달해줘야 한다.
            printInt2Consol printNum = new printInt2Consol(toDecimal);

            printNum(100);
            // 또는 printNum = toHexaDecimal
            printNum = new printInt2Consol(toHexaDecimal); ;
            printNum(100);

        }
        private void toDecimal(int val)
        {
            Console.WriteLine("{0}", val);
        }
        private void toHexaDecimal(int value)
        {
            Console.WriteLine("{0:X}", value);
        }
    }
}

 

 

 

 

 

 

 

 

delegate를 파라미터로 받는 예시

 

using System;

namespace ConsoleApp2
{
    class Program
    {
        public static int Add(int a, int b)
        {
            return a + b;
        }

        public static int Subtract(int a, int b)
        {
            return a - b;
        }
        static void Main(string[] args)
        {
            int a = 5, b = 3;

            int result1 = Calculator.Calculate(a, b, new Calculator.Operation(Add));
            Console.WriteLine("Addition: {0}", result1);

            int result2 = Calculator.Calculate(a, b, new Calculator.Operation(Subtract));
            Console.WriteLine("Subtraction: {0}", result2);
        }
    }

    // 계산 위한 클래스
    public class Calculator
    {
        // 반환형이 int고, int 두 개를 파라미터로 받는 델리게이트 선언
        public delegate int Operation(int a, int b);

        // 델리게이트를 매개변수로 받는 메서드
        public static int Calculate(int a, int b, Operation operation)
        {
            return operation(a, b);
        }
    }
}

 

 

 

 

 

 

delegate는 += 연산자를 사용하여 다른 메서드를 추가하거나, -= 연산자를 사용하여 등록된 메서드를 삭제할 수 있다. 이렇게 Delegate를 조작하는 것은 주로 이벤트와 함께 사용된다.

 

public delegate void MyDelegate(string arg1);
public event MyDelegate MyEvent;

// 메서드 추가
MyEvent += new MyDelegate(MyEventHandler);
MyEvent += new MyDelegate(MyEventHandler2);

// MyEventHandler와 MyEventHandler2의 구현..

 

 

// 메서드 삭제
MyEvent -= new MyDelegate(MyEventHandler2);

 

 

// 모든 메서드 삭제
MyEvent = null;