본문 바로가기
C#

C#] Delegates

by Fastlane 2022. 7. 6.
728x90
반응형

Delegate란?

method signature(return type and parameters)를 정의하는 참조형식의 data type이다. 

함수의 parameter로 전달될 수 있다. 

Delegate는 아래 3단계로 동작한다. 

1. Declare a delegate, 델리게이트 선언

    Delegate syntax 

[access modifier] delegate [return type] [delegate name]([parameters])

   string parameter와 void return type을 가지는 MyDelegate라는 이름의 delegate를 선언했다. 

public delegate void MyDelegate(string msg);

   delegate는 class 내부, 외부에서 모두 선언 가능하지만, class밖에서 선언되어야 한다. 

2. Set a target method, 함수 구현

target method나, lambda expression을 설정한다. 

public delegate void MyDelegate(string msg); // declare a delegate

// set target method
MyDelegate del = new MyDelegate(MethodA);
// or 
MyDelegate del = MethodA; 
// or set lambda expression 
MyDelegate del = (string msg) =>  Console.WriteLine(msg);

// target method
static void MethodA(string message)
{
    Console.WriteLine(message);
}

3. Invoke a delegate, 델리게이트 실행

Invoke() 함수나, () operator를 이용해서 실행한다. 

del.Invoke("Hello World!");
// or 
del("Hello World!");

Delegate Parameter

함수는 parameter로 delegate type을 가질 수 있다. 

함수는 다른 함수의 parameter로 전달 할 수 없다. 아래와 같이 compile error가 발생한다. 

하지만, delegate는 함수의 parameter로 전달할 수 있다. 

        public delegate int Manipulate(int a);

        public static int NormalMethod(int a)
        {
            return a * 2;
        }

        //public static int RunAnotherMethod(NormalMethod theMethod)
        //{
        //    return 0;
        //}

        public static int RunAnotherMethod(Manipulate theMethod, int a)
        { 
            return theMethod(a);
        }

        static void Main(string[] args)
        {
            //Invoking a normal method
            var b = NormalMethod(2);
            
            //Create an instance of the delegate
            Manipulate normalMethodDelegate = new Manipulate(NormalMethod);
            int normalResult = normalMethodDelegate(3);
            //Pass a delegate method as a variable
            int anotherResult = RunAnotherMethod(normalMethodDelegate, 4);

        }

Multicast Delegate

delegate는 복수개의 함수를 가리킬 수 있다. 

        MyDelegate del1 = ClassA.MethodA;
        MyDelegate del2 = ClassB.MethodB;

        MyDelegate del = del1 + del2; // combines del1 + del2

Generic Delegate

generic type의 parameter와 return type을 가지는 delegate를 정의할 수 있다. 

public delegate T add<T>(T param1, T param2); // generic delegate

 

Built-in Generic Delegate

C#은 Func, Action이라는 built-in generic delegate type을 포함한다. 

2개의 int type input과 int type return을 갖는 Func delegate이다. 

Func delegate는 다른 type의 0 ~ 16개의 input parameter를 가질 수 있다. 

Func<int, int, int> sum;

Func with an Anonymous Method

delegate keyword를 사용하여 Func delegate에 무명함수를 할당할 수 있다. 

Func<int> getRandomNumber = delegate()
                            {
                                Random rnd = new Random();
                                return rnd.Next(1, 100);
                            };

Func with Lambda Expression

Func<int> getRandomNumber = () => new Random().Next(1, 100);

//Or 

Func<int, int, int>  Sum  = (x, y) => x + y;

 

728x90
반응형

댓글