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