乐趣区

关于c#:C-学习笔记-6委托

委托是 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 办法。
举例:
runcmd1.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();

如果参数只有一个,并且是隐式类型则两端括号能够省略。

退出移动版