关于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();

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

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理