什么是委托委托是没有方法体的,声明委托就是一个关键字: delegate ,委托能够试有参无参,有返回值无返回值。和咱们的方法是同样的。不一样的区别是 委托没有方法体的,委托可放在类下也能够放在类的外面和类同等级。委托能够说是一个类型。api
委托的声明: 学习
//声明委托: public delegate int Parameter(int Para); public delegate void NoParameter(); public class Commondelegate { //声明委托: public delegate int Parameter(int Para); public delegate void NoParameter(); }
委托的实例化:spa
咱们能够把委托看做一个帮工每一个帮工都有各自的特长,这个帮工当你不告诉他要作什么的时候,他就不知道要作点什么,可是你使用他了,你就必需要指定他去作什么。不指定他去作什么然你就白花钱了,由于没有出活,帮工白请了。放到程序里就是报错了。委托是一个类也能够被实例化,他在实例化的时候须要给定参数。这个参数就是对应的方法。code
//委托实例化 NoParameter noParameter = new NoParameter(Program.NoParameter); Parameter parameter = new Parameter(Program.Parameter); /// <summary> /// 无参无返回值方法 /// </summary> public static void NoParameter() { } /// <summary> /// 有参有返回值方法 /// </summary> /// <param name="Para"></param> /// <returns></returns> public static int Parameter(int Para) { return Para; }
上面的代码中:咱们能够看到,委托的实例化目的就是为了调用某一个方法。可是咱们这样写的话,每使用一个相同的方法(注:参数相同,返回值相同,方法名不一样的方法,也就是声明委托时委托的类型)都须要去事先建立这样的一个方法。这样会又不少冗余的代码出现。blog
咱们换一种方法来实现上面的代码:get
//委托实例化去执行方法: NoParameter noParameterNew = new NoParameter( delegate () { Console.WriteLine("我是:无参无返回值方法"); } ); Parameter parameterNew = new Parameter( delegate (int Para) { Console.WriteLine("我是:有参有返回值方法"); return Para; } );
上面的代码实现了一样的结果:这其实就是委托了一个匿名方法去实现了功能。可是这种写法不少老前辈在工做的时候会写过,由于这多是在Net 1.0/2.0的时候版本升级前的写法,后来出现了lambda 表达式,代码是这样写的。it
//使用lambda 表达式 NoParameter noParameterNew1 = new NoParameter( () => { Console.WriteLine("我是:无参无返回值方法"); } ); Parameter parameterNew1 = new Parameter( (int Para) => { Console.WriteLine("我是:有参有返回值方法"); return Para; } );
上面的代码中使用 => // gose to 代替了delegate 这个时候咱们看到 => 的时候就很熟悉了lambda 是咱们常常会使用的. 其实lambda 更是一个匿名方法。咱们还能够进化一下,当方法体只有一行的时候能够这样写。io
咱们再换一种实现方式:class
//使用lambda 表达式 NoParameter noParameterNew1 = new NoParameter( () => Console.WriteLine("我是:无参无返回值方法") ); Parameter parameterNew1 = new Parameter( (Para) => Para );
上面的代码 中执行有参数的时候咱们能够看到咱们的参数并无去声明参数类型,委托会自动帮咱们去推算了。lambda
其实咱们还能够去这样写。
//使用lambda 表达式 NoParameter noParameterNew1 =() => Console.WriteLine("我是:无参无返回值方法"); Parameter parameterNew1 = (Para) => Para; Parameter parameterNew2 = Para => Para;
上面的代码咱们在看的时候,就愈来愈熟悉了,第一眼看过去你就会觉得是lambda吧,其实=号后面的代码是lambda,前面的仍是委托的实例。其实咱们大多数状况下是能够不用去声明委托的,系统已经给咱们准备好了两个方法供咱们使用:
Action; 无返回值委托最多可接收参数 16 个
Func; 有返回值委托,最多可接收参数16个 外加一个返回值参数。
https://docs.microsoft.com/en-us/dotnet/api/system.action?redirectedfrom=MSDN&view=netframework-4.7.2 官方的链接有详细的介绍。
上面的代码很简单,没有去深刻的去说一些东西。
有不足之处 但愿你们指出相互学习,
本文原创:转载请注明出处 谢谢!