C#学習ノート6.依頼

2272 ワード

依頼はc#の最も重要な特性の一つであり、c#の後のすべての特性は基本的に依頼の基礎の上に構築されている.1.c#の依頼とは何かc#の依頼は関数のパッケージとして理解でき、C#の関数はパラメータの方式で伝達され、これはC++の関数ポインタに相対的である.
依頼の定義はメソッドの定義と似ており,定義の前にdelegateキーワードを付ける.例:
 class Program
    {
        delegate void RunCmd(); //        
        static RunCmd runcmd1; //         
        static RunCmd runcmd2; //         
        static RunCmd runcmd3; //         

        public static void RunCmdExecute()
        {
            Console.Write("execute");
        }
        public void RunCmdPause()
        {
            Console.Write("Puase");
        }
        static void Main(string[] args)
        {
            runcmd1 = new RunCmd(RunCmdExecute);//      ,    
            //runcmd1 = RunCmdExecute; //            
            runcmd1 = new RunCmd(new Program().RunCmdPause);//      ,    
            //runcmd1 += new Program().RunCmdPause; //     
            runcmd1(); //           “pause”
            //     
            runcmd1 = RunCmdExecute;
            runcmd2 = new Program().RunCmdPause;
            runcmd3 = runcmd1 + runcmd2;
            runcmd3(); //    “executePuase”
            Console.Read();

        }
    }

依頼の呼び出しはメソッド(関数のように)の他に依頼のInvokeメソッドを用いる.例:runcmd 1.Invoke();//invoke翻訳は引用(ある人、ある理論、実例などを支持)とする.注意呼び出し依頼は空にできません.そうしないと、例外が発生します.
   if(runcmd1 != null)
   {
     runcmd1.Invoke();
   }
   runcmd1 ?.Invoke();//invoke             !

梱包の依頼方法には一定の制限がございます
1)メソッドの前と依頼は一致しており,パラメータの個数,タイプ,順序を含む.
2)メソッドの戻りタイプは依頼と一致し,メソッドの戻りタイプはメソッド署名の一部ではない.
2.なぜ依頼依頼を導入するかは、ある方法を別の方法のパラメータとして伝達することができる.
3.依頼の本質ILコードから依頼の本質がクラスであることが分かる.
4.委託チェーンc#における委託は、同様に複数の方法をカプセル化することができる.c#複数のメソッドをカプセル化する依頼を依頼チェーンやマルチキャスト依頼,組合せ依頼とする.5.戻り値を持つ依頼注意:依頼を組み合わせると、最後のメソッドの戻り値のみが返されます.6.参照パラメータ付き委任と参照付きメソッド(関数)に差はありません.7.匿名メソッド匿名メソッド独立したメソッド名を使用する必要はありません
delegate void RunCmd(); //        
RunCmd runcmd4 = delegate () //       ,          ()    
{
    Console.Write("    ");
};
runcmd4();

注:匿名メソッドでは、宣言の戻り値は表示されません.
8.Lambda表現式Lambda演算子=>は「goes to」と読み、この演算子はパラメータリストと関数本体の間に置かれます.
RunCmd runcmd5 =  ()=>
{
    Console.Write("lambda");
};
runcmd5();

パラメータが1つしかなく、暗黙的なタイプの場合は、両端カッコを省略できます.