C #에서 대리자를 사용하는 방법

대리자는 대리자의 서명과 동일한 서명이있는 메서드를 참조 할 수있는 형식이 안전한 함수 포인터입니다. C #의 대리자를 활용하여 이벤트 및 콜백 메서드를 구현할 수 있습니다. 멀티 캐스트 대리자는 동일한 서명을 가진 하나 이상의 메서드를 가리킬 수 있습니다.

C #의 대리자 이해

본질적으로 대리자는 메서드와 메서드가 호출되어야하는 대상 개체에 대한 참조를 보유합니다. C #의 대리자는 C ++의 함수 포인터와 비슷하지만 C # 대리자는 형식에 안전합니다. 대리자가 메서드를 가리 키도록하려면 메서드를 대리자에 매개 변수로 전달할 수 있습니다. 델리게이트는 콜백 메소드를 정의하고 이벤트 처리를 구현하는 데 사용되며 "delegate"키워드를 사용하여 선언됩니다. 자체적으로 표시되거나 클래스 내부에 중첩 될 수있는 대리자를 선언 할 수 있습니다.

대리자를 사용하는 데는 세 단계가 있습니다. 여기에는 선언, 인스턴스화 및 호출이 포함됩니다. 

대리인의 서명은 다음과 같습니다.

대리자 결과 유형 식별자 ([parameters])

다음 문은 대리자를 선언하는 방법을 보여줍니다.

public delegate void MyDelegate (string text);

위의 문에서 볼 수 있듯이 대리자 이름은 "MyDelegate"이고 반환 유형은 "void"이며 문자열 개체를 인수로받습니다. 이는 MyDelegate 대리자가 동일한 서명을 가진 메서드를 가리킬 수 있음을 의미합니다. 이것은 단지 선언 일뿐입니다. 사용하기 전에 델리게이트를 인스턴스화해야합니다. 다음에 주어진 문은 위에서 선언 한 대리자를 인스턴스화하는 방법을 보여줍니다.

MyDelegate d = new MyDelegate (ShowText);

대리자를 선언하고 인스턴스화 한 후에는 대리자가 가리키는 메서드를 쉽게 호출 할 수 있습니다.

d ( "Hello World ...");

여기서 d는 델리게이트 인스턴스입니다.

또한 아래와 같이 델리게이트 인스턴스에서 Invoke () 메서드를 사용하여 델리게이트 인스턴스가 가리키는 메서드를 호출 할 수 있습니다.

d.Invoke ( "Hello World ...");

두 숫자를 받아들이는 메서드가 있고 두 숫자를 더하고 두 숫자의 합계를 반환하려는 경우 아래 제공된 코드 조각에 표시된대로 대리자를 사용하여 메서드의 반환 값을 저장할 수 있습니다.

int 결과 = d (12, 15);

다음은 참조 용 전체 코드 목록입니다.

시스템 사용;

네임 스페이스 대리자

{

    공개 대리자 int MyDelegate (int x, int y);

    수업 프로그램

    {

      static int Sum (int x, int y)

        {

            반환 x + y;

        }

        정적 무효 Main ()

        {

            MyDelegate d = new MyDelegate (Sum);           

            int 결과 = d.Invoke (12, 15);

            Console.WriteLine (결과);

            Console.ReadLine ();

        }

    }

C #에서 활동중인 대리자

다음은 전체 코드 목록입니다.

시스템 사용;

네임 스페이스 대리자

{

    public delegate void MyDelegate (string text);

    수업 프로그램

    {

        public static void ShowText (문자열 텍스트)

        {

            Console.WriteLine (텍스트);

        }

        정적 무효 Main ()

        {

            MyDelegate d = new MyDelegate (ShowText);

            d ( "Hello World ...");

            Console.ReadLine ();

        }

    }

}

+ 연산자를 사용하여 대리자를 멀티 캐스팅 대리자로 만드는 대리자 인스턴스에 여러 개체를 할당 할 수 있습니다. 정적 메서드 Combine을 사용하여 대리자 인스턴스를 결합 할 수도 있습니다.

런타임은 여러 메서드를 실행하기 위해 내부적으로 목록 (호출 목록이라고도 함)을 유지합니다. 다음 코드 목록은 Combine () 메서드를 사용하여 여러 대리자 인스턴스를 결합하는 방법을 보여줍니다.

myDelegate d1 = 새로운 myDelegate (Method1);

myDelegate d2 = 새로운 myDelegate (Method2);

myDelegate multicastDelegate = (myDelegate) Delegate.Combine (d1, d2);

multicastDelegate.Invoke ();

여러 메서드를 가리킬 수있는 대리자를 멀티 캐스트 대리자라고합니다. 대리자 인스턴스는 변경할 수 없습니다. 따라서 대리자를 결합하거나 목록에서 하나의 대리자 인스턴스를 빼면 호출 할 대상 또는 메서드의 업데이트되거나 새 목록을 나타내는 새 대리자 인스턴스가 만들어집니다.

C #에서 작동중인 멀티 캐스트 대리자

다음 코드 목록은 멀티 캐스트 대리자를 보여줍니다. 대리자 인스턴스의 사용법에 유의하십시오. 여기서는 + = 연산자를 사용하여 동일한 서명을 가진 여러 메서드에 대리자를 할당했습니다.

시스템 사용;

네임 스페이스 대리자

{

    공개 대리인 void MyDelegate ();

    수업 프로그램

    {

        공공 정적 무효 Method1 ()

        {

            Console.WriteLine ( "Method1 내부 ...");

        }

        공공 정적 무효 Method2 ()

        {

            Console.WriteLine ( "Method2 내부 ...");

        }

        정적 무효 Main ()

        {

            MyDelegate d = null;

            d + = 방법 1;

            d + = 방법 2;

            d. Invoke ();

            Console.ReadLine ();

        }

    }

}

델리게이트는 이벤트 기반 프로그래밍을 구현하는 데 이상적입니다. 대리자는 자신이 참조하는 객체의 클래스를 알 필요가 없습니다. 그것이 알아야 할 것은 그것이 가리키는 방법의 서명뿐입니다. 대리자를 적절하게 사용하면 코드의 재사용 가능성과 디자인의 유연성을 높일 수 있습니다. 대리인에 대한 자세한 내용은 Microsoft의 온라인 설명서를 참조하십시오.