블로그 이미지
따시쿵

calendar

1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

Notice

2015. 6. 9. 16:35 C#

 

2. Func와 Action으로 더 간편하게 무명 함수 만드는 경우

 

익명 메서드와 무명 함수는 코드를 더 간결하게 만들어주는 요소들입니다. 하지만 이들을 선언하기 전에 해야 하는 일들을 생긱해 보면 익명 메소드를 만들기위해서 매번 델리게이트를 선언합니다. 이 문제를 해결하기 위해 마이크로소프트는 Func와 Action 델리게이트를 미리 선언해 두었습니다.Func 델리게이트는 결과를 반환하는 메소드를 참조하기 위해, Action 델리게이트는 결과를 반환하지 않는 메소드를 참조합니다.

 

 

2. Action 델리게이트

 

시스템이 입력 파라미터가 17개인 델리게이트를 미리 정의해 두었습니다. 

 

Action<T> 델리게이트

 

매개 변수가 하나이고 TResult 매개 변수에 지정된 형식의 값을 반환하는 메서드를 캡슐화 합니다.

 

 

구문

 

public delegate TResult Func<in T, out TResult>(
     T arg
)


형식 매개 변수

 

in T
      이 대리자로 캡슐화되는 메서드의 매개 변수 형식입니다.
      이 형식 매개 변수는 반공변입니다.

      즉, 지정한 형식이나 더 적게 파생되는 모든 형식을 사용할 수 있습니다.

 

설명

 

Action<T> 델리게이트를 사용하면 사용자 지정 대리자를 명시적으로 선언하지 않고도 메서드를 매개 변수로 전달할 수 있습니다.

 

캡슐화된 메서드는 이 대리자에 의해 정의되는 메서드 시그니처(파리미터 타입과 갯수)와 일치해야 합니다.

즉, 캡슐화된 메서드에는 값으로 전달되는 매개 변수 하나가 있어야 하고 값을 반환하지 않아야 합니다.

 

C#의 경우 이 메서드는 void를 반환해야 합니다. 무시되는 값을 반환하는 메서드일 수도 있습니다. 일반적으로 이러한 메서드는 작업을 수행하는 데 사용됩니다.

 

 

예제1

 

Action<T> 델리게이트를 사용하는 경우에는 매개 변수가 하나인 메서드를 캡슐화하는 대리자를 명시적으로 정의할 필요가 없습니다.

 

예를 들어, 다음 코드에서는 DisplayMessage라는 델리게이트를 명시적으로 선언하고 WriteLine 메서드 또는 ShowWindowsMessage 메서드에 대한 참조를 해당 델리게이트 인스턴스에 할당합니다.

    delegate void DisplayMessage(string message);
    class Program
    {
        static void Main(string[] args)
        {
            DisplayMessage messageTarget;

            if (Environment.GetCommandLineArgs().Length > 1)
                messageTarget = ShowWindowMessage;
            else
                messageTarget = Console.WriteLine;

            messageTarget("Hi, Korea world !!!");

            Console.ReadLine();
        }

        static void ShowWindowMessage(string message)
        {
            MessageBox.Show(message);
        }
    }

 

예제2

 

다음 예제에서는 새 델리게이트를 명시적으로 정의하고 명명된 메서드를 할당하는 대신 Action<T> 델리게이트를 인스턴스화하여 이 코드를 간소화합니다.

    class Program
    {
        static void Main(string[] args)
        {
            Action<string> messageTarget;

            if (Environment.GetCommandLineArgs().Length > 1)
                messageTarget = ShowWindowMessage;
            else
                messageTarget = Console.WriteLine;

            messageTarget("Hi, Korea world !!!");

            Console.ReadLine();
        }

        static void ShowWindowMessage(string message)
        {
            MessageBox.Show(message);
        }

예제3

 

Action<T> 델리게이트를 anonymous method와 함께 사용할 수도 있습니다.

    class Program
    {
        static void Main(string[] args)
        {
            Action<string> messageTarget;

            if (Environment.GetCommandLineArgs().Length > 1)
                messageTarget = delegate(string s) { ShowWindowMessage(s); };
            else
                messageTarget = delegate(string s) { Console.WriteLine(s); };

            messageTarget("Hi, Korea world !!!");

            Console.ReadLine();
        }

        static void ShowWindowMessage(string message)
        {
            MessageBox.Show(message);
        }

 

예제4

 

Action<T> 델리게이트 인스턴스에 람다 식을 할당할 수도 있습니다.

    class Program
    {
        static void Main(string[] args)
        {
            Action<string> messageTarget;

            if (Environment.GetCommandLineArgs().Length > 1)
                messageTarget = (string s) => { ShowWindowMessage(s); };
            else
                messageTarget = (string s) => { Console.WriteLine(s); };

            messageTarget("Hi, Korea world !!!");

            Console.ReadLine();
        }

        static void ShowWindowMessage(string message)
        {
            MessageBox.Show(message);
        }

 

 

실행화면은 아래와 같이 두 가지 화면이 동일하게 나옵니다. 

 

 

 

'C#' 카테고리의 다른 글

람다식(Lambda Expression) - 4  (0) 2015.06.11
람다식(Lambda Expression) - 2  (0) 2015.06.09
람다식(Lambda Expression) - 1  (0) 2015.06.08
EventHandler 와 EventHandler<TEventArgs> Delegate  (0) 2015.06.04
Event 와 Delegate  (0) 2015.06.01
posted by 따시쿵