무명 메소드가 필요할 때 이를 참조할 수 있는 델리게이트 변수가 있어야 한다.

그러기 위해 델리게이트 타입을 선언해야 하는데, 만약 각기 다른 타입의 무명 메소드를 여럿 만들 때는 어떻게 할것인가?

일일이 그 타입에 맞는 타입과 변수를 따로 선언해야 하며 이는 매우 비효율적이다.

따라서 c#에서는 Func과 Action 델리게이트를 제공한다.

Func과 Action은 미리 서언된 델리게이트 변수로써 별도의 선언없이 사용가능하다.

Func은 반환값이 있는 메소드를 참조하는 델리게이트 변수이고,

Action은 반환값이 없는 메소드를 참조하는 델리게이트 변수다.

-Func 델리게이트

.NET Framework에는 총 17가지의 Func 델리게이트가 준비되어 있다.

즉, 매개변수가 없는 메소드부터 매개변수가 16개인 메소드까지

총 17개의 메소드를 참조 가능하다는 말이다. (무명 메소드 뿐만 아니라 일반 메소드도 참조 가능)

이정도면 특별한 경우가 아니고서야 별도의 델리게이트를 만들어 쓸 필요가 없겠다.

Func 델리게이트 변수를 선언하는 방법은 다음과 같다.

 

class Program
    {
        static float temp(int a, int b, int c)
        {
            return (a + b + c) * 0.1f;
        }

        static void Main(string[] args)
        {
            //매개변수가 없고 반환형이 float
            Func<float> func0 = () => 0.1f;

            //매개변수가 하나고 반환형이 float
            Func<int, float> func1 = (a) => a * 0.1f;

            //매개변수가 둘이며 반환형이 float
            Func<int, int, float> func2 = (a, b) => (a + b) * 0.1f;

            //매개변수가 셋이고 반환형이 float
            Func<int, int, int, float> func3;

            //일반 매서드 참조
            func3 = new Func<int, int, int, float>(temp);

            Console.WriteLine("func0 반환값: {0}", func0());
            Console.WriteLine("func1 반환값: {0}", func1(10));
            Console.WriteLine("func2 반환값: {0}", func2(10, 10));
            Console.WriteLine("func3 반환값: {0}", func3(10, 10, 10));

        }
    }

예제에서 보듯이 반환형이 있는 델리게이트 메소드기 때문에 항상 마지막에 반환타입을 넣어준다.

-Action 델리게이트

참조하는 메소드의 반환값이 없다는 것만 빼고 Func과 동일하다.

class Program
    {
        static void temp(string name)
        {
            Console.WriteLine("name : {0}", name);
        }

        static void Main(string[] args)
        {
            int sum = 0;

            Action act0 = () => Console.WriteLine("name : 액트0");
            Action<string> act1 = new Action<string>(temp);
            Action<string, string> act2 = (name, age) =>
             {
                 Console.Write("name : {0}", name);
                 Console.WriteLine(" age :{0}", age);
             };
            Action<int, int, int> act3 = (a, b, c) => sum = a + b + c;

            act0();
            act1("액트1");
            act2("액트2", "22");
            act3(100, 209, 3);

            Console.WriteLine("sum: {0}", sum);

            //이렇게 메서드를 만드는 것이랑 무슨 차이가 있는가 고민하다 무명 메소드를 만들면 성능상의 이점이 있다는 글 발견.
            //void act2(string name, string age)
            //{
            //    Console.Write("name : {0}", name);
            //    Console.WriteLine(" age :{0}", age);
            //}
        }
    }



'게임 프로그래밍 > C#' 카테고리의 다른 글

구조체와 클래스 차이  (0) 2021.11.12
델리게이트  (0) 2021.11.12
Delegate, Event  (0) 2021.11.12
Interface  (0) 2021.11.12
일반화 컬렉션  (0) 2021.11.12
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기
위와 같은 스크립트 코드를 추가하면 H2가 두 개 이상이거나 H3가 두 개 이상인 경우 첫 번째 H2 헤딩 태그 앞에 목차를 표시합니다. 만약 H2가 한 개도 없으면 목차가 표시되지 않습니다. H3 이상부터 있는 경우에는 코드를 조금 수정해야 합니다. 다음과 비슷하게 하면 잘 작동합니다.