C#依頼の詳細説明


C#依頼の詳細まとめ
1.依頼とは
       依頼はC#の一種であり、その役割はC言語の関数ポインタに相当し、方法のタイプを定義し、方法を別の方法のパラメータとして伝達することができる.この方法をパラメータに動的に割り当てる方法は、if-else(Switch)文をプログラムで大量に使用することを回避し、プログラムの拡張性を向上させることができる.       依頼とクラスは同じレベルで、delegateを直接キーワードclassと見なすことができます.classに格納されているのは一連の方法、属性、フィールド、イベント、インデックスと区別されます.delegateには、同じタイプのパラメータと戻りタイプを持つ一連のメソッドのアドレスが格納されています.貯蔵方法の担体として見ることができる.
2.委任の宣言
delegate依頼名(関数パラメータ)例:public delegate void MyDelegate(string name);
3.インスタンス化依頼
(1)通常のインスタンス化委任構文:インスタンス化名=new(登録関数)注意:登録関数にはパラメータが含まれていないか、または直接1つの登録関数を委任に割り当てることができます.例:
MyDelegate  _md = new MyDelegate(method);

(2)匿名メソッドインスタンス化依頼構文:=delegate(){関数体};例:
 MyDelegate  md = delegate(string s) 
 {
   	Console.WriteLine(s); 
 };

(3)Lambda式を使用した委任構文のインスタンス化:パラメータ列=>文またはブロック使用規則:
  • 「Lambda式」のパラメータの数は、「委任」のパラメータの数と同じでなければならない.
  • 「委任」パラメータにrefまたはout修飾子が含まれている場合、「Lambda式」のパラメータ列にも修飾子が含まれている必要があります.    例:
  •  class Test
        {
            public delegate void MyDelegate(out int x);//    
            static void Print(MyDelegate test)
            {
                int i;
                test(out i);
                Console.Write(i);
            }
            static void Main()
            {
                Print((out int x) => x = 3);
                Console.Read();
            }
        }
    

           この3つの方法はいずれも機能を実現することができ,lamda式は依頼の宣言を簡略化し,依頼のインスタンス化と呼び出しを簡略化しただけである.次の例では、3つの違いを見てみましょう.
    class Program
        {
            //    
            delegate int MyDelegate(int x, int y);
            static void Main(string[] args)
            {
                //     
                //1、  new   
                MyDelegate _md = new MyDelegate(Sum);
                //2、      
                MyDelegate md= delegate(int x, int y)
                {
                    return x + y;
                };
                //3、  Lambda   
                MyDelegate mdLambda = (int x, int y) => { return x + y; };
            }
            static int Sum(int x, int y)
            {
                return x + y;
            }
        }
    

    4.マルチキャスト依頼
           マルチキャスト依頼はDelegate、すなわち「マルチキャスト依頼」(MulticastDelegate)から継承される.名前から分かるように、この依頼は放送のように影響情報を四方八方に「伝える」ことができる.マルチキャスト依頼クラスにはメソッド呼び出しリストがあり、依頼を呼び出すと、そのリストのメソッドが1つずつ呼び出され、多重の影響が得られます.       実生活では、マルチキャスト依頼の例は随所に見られますが、例えば、ある注文アプリでは、普通の食事を予約したり、ケーキや花、果物などの商品を予約したりすることができます.ここで依頼は注文プラットフォームに相当し、各タイプの商品は依頼に登録する方法と理解できる.
    4.1マルチキャスト依頼の実例化
           マルチキャスト依頼の初期化は、通常の依頼のように、署名と同じインスタンスメソッドを送信することができる.同時に、マルチキャスト依頼は+=演算子と-=演算子を再ロードし、呼び出しリストにメソッドを追加または削除するために使用されます.マルチキャスト依頼を呼び出すと,メソッドは追加の順序で順次呼び出される.単純な加減演算の実行依頼を定義し、+=演算子とLambda式を使用してマルチキャスト依頼に2つの方法を追加します.
    public delegate int AddDelegate(int a);
    AddDelegate md = new AddDelegate(i => i + 10);
    md += i => i - 10;
    

    4.2マルチキャスト依頼の呼び出しと返却結果
    !!!依頼を使用すると、直接md()は、md.Invoke()を使用して上のAddDelegateを呼び出し、パラメータ10を入力することに相当します.
    Console.WriteLine(md(10));
    

    コードの実行結果:
    0
    

            質問はありますか?なぜ2つのメソッドがあるのか、なぜ1つの戻り値しかないのでしょうか.        実際には、両方のメソッドが呼び出されました.実例説明:        マルチキャスト依頼は、リスト内のメソッドを順番に呼び出す.まず,パラメータはi=>i+10関数を先に呼び出し,関数戻り値20を得た.しかしながら、依頼された呼び出しは停止せず、残りのメソッドの呼び出しを継続する.その後、パラメータに対してi=>i-10関数を呼び出し続け、新しい戻り値0が得られ、前の関数の戻り値が上書きされます.これで依頼呼び出しが終了し、最後の呼び出しメソッドの戻り結果が返されます.        従って、非空の戻り値を有するマルチキャスト依頼は、通常、最後の方法の戻り結果しか得られないため、意味がない.したがって、通常、マルチキャスト依頼の戻りタイプはvoidである.
    4.3マルチキャスト依頼の逐次呼び出し
            では,戻りタイプが空でないマルチキャスト依頼に対して,すべてのメソッドの戻り結果を得ることはできないだろうか.答えは、マルチキャスト依頼は、呼び出しリスト内のメソッドを順番に取得して実行できるGetInvocationList()メソッドを提供することである.使用例:
    Console.WriteLine("     :");
    foreach (AddDelegate f in md.GetInvocationList())
        Console.WriteLine(f.Invoke(10));
    

    これにより、メソッドの出力結果が1つずつ得られます.
    20
    0
    

    5.汎用依頼
    5.1汎用型委託原型
            委託も汎用の使用をサポートし、汎用委託プロトタイプ:delegate(T 1 t 1,T 2 t 2,T 3 t 3...)
    5.2汎用委託の組み込み
    Func依頼       Func依頼は,戻り値を持つ汎用依頼を表す.FuncにはFuncのような一連のリロードがあり、TResultは委任された戻り値タイプを表し、残りはパラメータタイプである.Tが1つしかない場合,すなわちFuncは,その依頼がパラメータなしであることを表す.NETには最大16個の入力パラメータのFunct<>依頼が封入されている.       !!!メソッドがvoidを返すと、voidはデータ型ではないため、Func依頼は定義できません.アクション依頼       Action委任は、戻り値が空のvoidの委任を表し、いくつかのカラムが再ロードされ、最大16個の入力パラメータがあります.使い方はFuncと同じです.Predicate依頼       この一般的な使用は少なく,パッケージ戻り値がboolタイプの依頼であり,Funcに取って代わることができる.
    6.依頼の用途
           はっきり言って、依頼は第三者で、呼び出し者は第三者に何をするかを教えて、それから呼び出し者はこの依頼(第三者)を気にしないで方法を呼び出して実現します.使用依頼のメリット:       1.メソッドを別のメソッドパラメータとして使用することに相当する(Cの関数ポインタと同様)       2.2つの直接呼び出すことができない方法の中で橋渡しとして、例えば、マルチスレッドの中のスレッドをまたぐ方法の呼び出しは依頼しなければならない.       3.メソッドが具体的に何を実現するか分からない場合に依頼を使用します.たとえば、イベントで依頼を使用します.