posted by 방랑군 2012. 1. 17. 02:25

delegate 리턴타입 델리게이트명(파라미터);

 

델리게이트는 자신에게 연결된 함수를 대신 실행시켜주는 역할을 하는 일종의 함수 포인터이다.
즉 자신에게 할당된 함수를 대신 실행시켜준다.

 

델리게이트와 연결된 메서드의 목록을 확인할 때에는 GetInvocationList 메서드를 이용한다.


ex) foreach (var delegate in XXXXDelegate.GetInvocationList()) { // ... }

 

델리게이트는 익명 메서드, 람다 메서드와 궁합이 잘 맞는다.
익명 메서드, 람다 메서드는 표현식을 간결하게, 인라인의 형태로 가져감으로써 코드가 축약되고
경우에 따라 가독성이 향상된다.

 

1. 익명 메서드 (이름이 없는 메서드)
델리게이트에 의해 호출되는 함수가 단순한 작업을 수행하는 '짧은' 메서드라면 굳이 새롭게 메서드의 이름을 정의하고 구현하는 것보다 익명 메서드를 이용하는 것이 낫다.

 

ex)
delegate void SampleDelegate(string message);

SampleDelegate sample = delegate(string message)
{
 Console.WriteLine(message);
};

sample("Hello, World");

 

2. 람다 메서드 (익명 메서드의 소집합)
람다식의 특징은 람다 연산자 '=>'에 있다.

1번의 예제 내용이 다음과 같이 축약됩니다.


ex)
SampleDelegate sample = (string message) => Console.WriteLine(message);

Delegate(대리자) 

 1] 함수의 기능을 대신해 주는 대리자 역할을 한다.

 2] 여기서 대리자라 하면 자신에게 전달된 함수를 대신해 준다고 보면..

 3] Delegate를 선언하려면 함수의 시그너쳐를 일치

  ==> 함수의 매개변수와 데이터 타입.....

 4] 이벤트는 델리게이트 기반으로 만들어 졌다.

   Ex) this.버튼.click += .....();

Delegate 선언

 delegate 리턴타입 델리게이트명(파라미터타입 변수);

Delegate 생성 및 호출

 델리게이트명 델리변수명 = new 델리게이트명(생성함수명);


 public 리턴타입 생성함수명(파라미터타입 변수)

 {

   // 코드

 }

Delegate 간단 예제_1

 delegate void deleTest(string strParam);

 static void Main(string[] args)
 {
    deleTest testDele_1 = new deleTest(dely);
    deleTest testDele_2 = new deleTest(dely);

    testDele_1("도망노비 테스트_1");
    testDele_2("이게 델린가여??");
 }

 public static void dely(string strParam)
 {
    Console.WriteLine(strParam);
 }

Delegate 간단 예제_2

 delegate void deleTest(string strParam);

 class Program
 {
    public static void Main()
    {
        TestDele classDele = new TestDele();
        deleTest dele_1 = new deleTest(classDele.DeleTest_1);
        dele_1("11");

        deleTest dele_2 = new deleTest(classDele.DeleTest_2);
        dele_2("11");
    }
 }

 class TestDele
 {
   public void DeleTest_1(string strParam)
    {
        Console.Write("Static_TEST ==> ");
        Console.WriteLine(strParam);
    }
    public void DeleTest_2(string strParam)
    {
        Console.Write("TEST ==> ");
        Console.WriteLine(strParam);
    }
 }


[출처] [C#] Delegate|작성자 에스이오케이