【초보자용】delegate를 이해하려고 해도 1밀리도 이해할 수 없는 사람을 위한 delegate 입문

C# Advent Calendar 2018 - Qiita 3일째 기사입니다

제목은 내 일입니다.



C#을 업무 수준에서 사용하기 시작한 지 1개월
업무의 코드로 =>>
delegate라는 말을 만나서 막혔습니다.

솔직히 끓인 의문


  • delegate 뭐야 맛있어?
  • => 가 오징어 밖에 보이지 않는다
  • Action action = () => Console.WriteLine("Hello, World!!"); 이콜이 ()에 끼워져 오징어가 발생하고 있어
  • Func < T > Action < T > 함수에 "< > "가 붙어 있고 수수께끼

  • 이미지는 이미지


    즉 delegate야말로 본질 (아마)



    조금씩 조사한 곳에서는 LINQ 앞에 람다 식 람다 식의 훨씬 전에
    delegate를 이해하지 않으면 안되는 것 같은 것을 알았습니다.

      

    초학자는 공식을 봐도 모르겠다.



    대리자(C# 프로그래밍 가이드) | Microsoft Docs
    ·····
    모르겠다는 것을 알았다

    원래 왜 delegate가 나오는지



    제13장 처리를 위양하는 대리자 (1/4)

    델리게이트는 일본어로는 '위양'으로 번역되는 경우가 많다. 위양이라는 말을 알기 어렵다고 생각한다면 대표자로 생각해도 된다. 무언가의 처리를 실행시키고 싶을 때에, 처리 기능을 가지는 메소드를 직접 호출하는 것이 아니라, 대표자에게 처리를 요구하는 것이다. 대표자는 처리 기능은 가지고 있지 않지만, 그것을 처리할 수 있는 적절한 메소드를 알고 있어 그 메소드에 처리 요구를 건네준다.


    회사에 비유한다면 「A부」의 하단이 「B부」의 하단에 부탁할 때, 「B부」의 부장이라면 모든 방법을 알고 있기 때문에 거기에 간다고 하는 느낌일까요.

    즉, delegate는 대표자입니다.

    검색하면 여러가지 예가 나옵니다만, 코드량이 늘어나는(조직이 거대) 위력이 발휘할 것 같은 것은 알 수 있습니다.

    선구자 사이트에서 공부하기



    대리자 - C#에 의한 프로그래밍 시작 | ++C++; // 미확인 비행 C

    대리자는 메서드를 참조하는 형식입니다. 요컨대, A 라는 이름
    의 메소드와 델리게이트형의 변수 a 가 있었다고 하면, a = A;일을 실현하는 것이 대리자입니다.

    샘플

    sample.cs
    
     // SomeDelegate という名前のデリゲート型を定義
    using System;
    delegate void SomeDelegate(int a);
    class DelegateTest
    {
          static void Main()
          {
            // SomeDelegate型の変数にメソッドを代入。
            SomeDelegate a = new SomeDelegate(A);
    
            a(256); // デリゲートを介してメソッドを呼び出す。
                    // この例では A(256) が呼ばれる。
          }
    
           static void A(int n)
          {
            Console.Write("A({0}) が呼ばれました。\n", n);
          }
    }
    
    A(256) が呼ばれました。
    C# 2.0부터는 SomeDelegate a = A; 라고 하는 것처럼, 메소드로부터 델리게이트에의 암묵의 변환을 할 수 있게 되었습니다.

    sample.cs
        using System;
        // SomeDelegate という名前のデリゲート型を定義
        delegate void SomeDelegate(int a);
    class DelegateTest
    {
          static void Main()
          {
            // SomeDelegate型の変数にメソッドを代入。
            //SomeDelegate a = new SomeDelegate(A);
          //C# 2.0 からはこれ
          SomeDelegate a = A;
    
            a(256); // デリゲートを介してメソッドを呼び出す。
                    // この例では A(256) が呼ばれる。
          }
    
           static void A(int n)
          {
            Console.Write("A({0}) が呼ばれました。\n", n);
          }
    }
    

    => 오징어 밖에 보이지 않는 splatoon에 오염되었습니까?



    게다가 이것에 익명 메서드 표현? ? 를 더해, void A를 간략화하면 이렇게 되는 것 같습니다.

    sample.cs
    using System;
    // SomeDelegate という名前のデリゲート型を定義
    delegate void SomeDelegate(int a);
    class DelegateTest
    {
        static void Main()
        {
            // SomeDelegate型の変数にメソッドを代入。
            //SomeDelegate a = new SomeDelegate(A);
            //C# 2.0 からはこれ
            //SomeDelegate a = A;
            SomeDelegate a = new SomeDelegate(delegate (int n) { Console.WriteLine("A({0}) が呼ばれました。\n", n); });
    
            a(256);          // この例では a(256) が呼ばれる。
        }
    
        //static void A(int n)
        //{
        //    Console.Write("A({0}) が呼ばれました。\n", n);
        //}
    }
    
    

    덧붙여 C# 3.0 이후에서는, 익명 메소드 대신에 람다 식을 사용할 수 있습니다.
    대리자 (프로그래밍) - Wikipedia

    sample.cs
    using System;
    // SomeDelegate という名前のデリゲート型を定義
    delegate void SomeDelegate(int a);
    class DelegateTest
    {
        static void Main()
        {
            // SomeDelegate型の変数にメソッドを代入。
            //SomeDelegate a = new SomeDelegate(A);
            //C# 2.0 からはこれ
            //SomeDelegate a = A;
            //SomeDelegate a = new SomeDelegate(delegate (int n) { Console.WriteLine("A({0}) が呼ばれました。\n", n); });
            SomeDelegate a =(n)=> { Console.WriteLine("A({0}) が呼ばれました。\n", n); };
            a(256);    // この例では a(256) が呼ばれる。
    
        }
    
        //static void A(int n)
        //{
        //    Console.Write("A({0}) が呼ばれました。\n", n);
        //}
    }
    

    여기까지 오가오카 마크까지 도달! !
    오, 무려

    Action action = () => Console.WriteLine("Hello, World!!"); 이콜이 ()에 끼워져 오징어가 발생하고 있어 더욱 수수께끼



    심지어 클리어 할 수있었습니다!

    Func< T >Action< T >함수에 "< > "가 붙어 있고 수수께끼



    체력이 붙었습니다・・・
    다음에 하자.

    이번에는 이 정도로 해 줘서 게소



    이번 소스는 C# .netcore 콘솔 어플리케이션으로 복사하면 움직입니다.
    여러분의 꼭 순서대로 챌린지

    좋은 웹페이지 즐겨찾기