C# 대리자 및 멀티캐스트 대리자 소개

C# 대리자란 무엇입니까?



C# 대리자는 메서드와 해당 서명을 정의하는 참조 데이터 형식입니다. 대리자는 하나 이상의 메서드 주소를 저장합니다. 메서드에 대한 대리자가 할당되면 메서드와 똑같이 작동합니다. 매개 변수와 반환 값이 있는 다른 메서드처럼 호출할 수 있습니다. 대리자는 반환 형식 및 매개 변수 목록과 같은 서명이 동일한 메서드 참조를 저장하기만 하면 됩니다. 대리자는 대리자에 대한 개체를 만들어 클래스처럼 호출할 수 있습니다. 대리자 개체를 사용하면 직접 호출하지 않고 런타임에 메서드를 실행할 수 있습니다.

이 게시물은 원래 DevelopersDoors에 게시되었습니다.

대리자의 사용법:



이벤트를 사용해야 하는 경우 대리자를 사용할 수 있습니다. 멀티캐스트 대리자는 한 번에 많은 이벤트를 호출하는 데 사용할 수 있습니다. 클래스에 메서드 구현이 두 개 이상 필요하고 정적 메서드를 캡슐화해야 하는 경우.

대리자 및 인터페이스를 사용하는 경우 참조 -> https://docs.microsoft.com/en-us/previous-versions/visualstudio/visual-studio-2010/ms173173(v=vs.100)

대리인 선언:


System.Delegate 클래스는 대리자 선언의 기본 클래스입니다. delegate 키워드는 대리자를 선언하는 데 사용됩니다. 반환 유형 및 매개 변수는 메서드와 동일해야 합니다.

예:
public delegate int CalDelegate(int num1,int num2);

인스턴스화 및 대리자 호출:



대리자를 인스턴스화하기 위해 클래스 인스턴스가 생성되는 방식과 유사하게 인스턴스가 생성됩니다. 대리자가 인스턴스화되면 메서드의 주소가 인스턴스에 저장됩니다.

예: Calculator cal=new Calculator();
CalDelegate sumDel=new CalDelegate(cal.sum);
CalDelegate mulDel=new CalDelegate(cal.multiply);
CalDelegate는 생성된 대리자이고 sumDel는 cal 인스턴스의 CalDelegate 메서드를 참조하여 sum()로 인스턴스화된 대리자 인스턴스이며 mulDelmultiply() 메서드를 참조하기 위한 것입니다.

대리자를 호출하려면 동일한 데이터 형식의 대리자가 참조하는 매개 변수 목록을 사용하여 대리자 인스턴스를 호출합니다.

예: sumDel(10, 12);mulDel(10,12);

using System;

public delegate int CalDelegate(int num1,int num2);
public class Calculator
{
    public int sum(int num1,int num2)
    {
        return num1+num2;
    }
    public int multiply(int num1,int num2)
    {
        return num1*num2;
    }
}
public class Program
{
    public static void Main()
    {
        Calculator cal=new Calculator();
        CalDelegate sumDel=new CalDelegate(cal.sum); // sumDel for sum() reference
        CalDelegate mulDel=new CalDelegate(cal.multiply); //mulDel for multiply() reference
        Console.WriteLine(sumDel(10,12));
        Console.WriteLine(mulDel(10,12));
    }
}



산출:

22

120

멀티캐스트 대리자:



대리자 멀티캐스트 대리자에서 둘 이상의 메서드에 대한 참조가 사용됩니다. 이것은 주로 다중 이벤트 호출에 사용됩니다. += 연산자는 대리자에 참조되는 메서드를 추가하는 데 사용되며 -= 연산자는 메서드를 제거하는 데 사용됩니다. 메서드는 FIFO(선입 선출) 순서로 호출됩니다.

멀티캐스트 대리자를 사용할 때 여러 메서드를 사용하면 반환 형식이 충돌하므로 void를 반환 형식으로 사용한다는 점을 기억하세요. 따라서 void는 런타임 예외를 피하기 위해 안전합니다.

예:
CalDelegate simpleDel=new CalDelegate(cal.sum);simpleDel += new CalDelegate(cal.multiply);simpleDel -= new CalDelegate(cal.sum);

using System;

public delegate void CalDelegate(int num1,int num2);
public class Calculator
{
    public void sum(int num1,int num2)
    {
        Console.WriteLine(num1+num2);
    }
    public void multiply(int num1,int num2)
    {
        Console.WriteLine(num1*num2);
    }
}
public class Program
{
    public static void Main()
    {
        Calculator cal=new Calculator();
        CalDelegate simpleDel=new CalDelegate(cal.sum);
        simpleDel+=new CalDelegate(cal.multiply); //multicasting using += operator
        simpleDel(10,12);
    }
}



산출:

22

120

위의 대리자 예제는 첫 번째sum() 메서드가 simpleDel 대리자를 참조하는 멀티캐스트 대리자와 함께 사용됩니다. 그런 다음 multiply() 연산자를 사용하여 멀티캐스트에 += 메서드가 추가됩니다. 대리자에서 메서드를 제거하려면 -= 연산자를 사용하면 됩니다. 멀티캐스트 델리게이트가 FIFO에서 실행되는 것처럼 첫 번째sum() 델리게이트 참조가 실행된 다음multiply() 출력 22와 120이 각각 실행됩니다.

대리인에 대한 문서는 -> https://docs.microsoft.com/en-in/dotnet/api/system.delegate?view=netcore-3.1를 참조하십시오.

다음 포스트에서는 동기 델리게이트, 비동기 델리게이트, 공분산 델리게이트와 반공변 델리게이트에 대해 설명하겠습니다.

내 다른 C# 아카이브의 경우 -> Go .

내 게시물이 마음에 들면 공유하고 제안 사항이 있으면 댓글을 달아주세요.

좋은 웹페이지 즐겨찾기