委托是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();
如果参数只有一个,并且是隐式类型则两端括号能够省略。