C〓〓中の依頼は何に使いますか?

1992 ワード

C〓〓の中で私達は1つの概念を耳にすることができます.依頼は何の鬼ですか?何に使いますか?最近は暇な時にC〓の依頼に関する知識を書いています.開門して山を見て、実はC〓の中の委託は伝達のコールバック関数を実現するために用います.他の言語では、javascriptのように、関数の中にあるコールバック関数を伝達すると、この関数が対応する動作を実行した後に、過去のコールバック関数を呼び出すことができます.javascriptでこれを実現するのは簡単です.コールバックが必要な関数名を伝達するだけでいいです.しかし、C# では違っています.C#は強いタイプの言語だと知っています.関数のパラメータは厳密なタイプが必要です.また、直接関数を別の関数として使用するパラメータも許されない.できるとしても、このコールバック関数の型はどうやって説明しますか?このような気まずい状況の下に生まれたリプライです.下のコードを見てみます.もしjavascriptの論理でコードを書くなら、コードはこうなるべきです.
using System;

namespace Test
{
    class Test
    {
        public Test()
        {
            Calculate(23, 45, ShowText);
        }

        public void Calculate(int num1, int num2, callback)
        {
            int sum = num1 + num2;
            callback(sum.ToString());
        }

        public void ShowText(string text)
        {
            Console.WriteLine(text);
        }
    }
}
しかし、ShowTextという関数名を直接Calculateに渡す方法は明らかにCピラーではエラーが発生します.私たちはこの時に依頼を使う必要があります.そこで私たちは一つの依頼を追加しました.次のようにします.
using System;

namespace Test
{
    class Test
    {
        public Test()
        {
            ShowTextDel showTextDel = ShowText;  //          ,      。
            Calculate(23, 45, showTextDel);
        }

        public void Calculate(int num1, int num2, ShowTextDel callback)
        {
            int sum = num1 + num2;
            callback(sum.ToString());
        }

        //         `string`        `void`      。
        public delegate void ShowTextDel(string text);  

        public void ShowText(string text)
        {
            Console.WriteLine(text);
        }
    }
}
依頼があればdelegateでコールバック関数を伝達することができます.ただし、依頼には以下のような注意点があります.
  • は、関数または方法としての容器を委託する以上、強いタイプのCピラーには、関数または方法および委託が同じ構造を有する必要がある(すなわち、委託は、関数または方法と同じパラメータリストおよび同じ返却値が必要である).
  • は、関数または方法としてのコンテナに委託しており、一つの依頼は、複数の関数または方法を収容することができる.この依頼を呼び出すときは、この依頼の各方法を順次呼び出します.具体的にはマイクロソフトの公式文書を参照することができます.