委托、匿名方法、Action、Func、Lambda个人笔记
A:委托
微软msdn上解释说:委托是一种引用类型,表示对具有特定参数列表和返回类型的方法的引用。 在实例化委托时,你可以将其实例与任何具有兼容签名和返回类型的方法相关联。
对于这句话只能慢慢体会,项目写多了,coding多就会慢慢体会其中含义。
既然有委托那么如果调用微软msdn又解释说:对委托进行实例化后,委托会将对其进行的方法调用传递到该方法。 调用方传递到委托的参数将传递到该方法,并且委托会将方法的返回值(如果有)返回到调用方。 这被称为调用委托。 实例化的委托可以按封装的方法本身进行调用。
有定义,有调用那为什么微软要使用委托这种类型方法?看到微软官网上说在那种情况下使用委托:
在下列情况下使用委托:
-
使用事件的设计模式。
-
最好封装一个静态方法。
-
调用方不需要访问实现该方法的对象上的其他属性、方法或接口。
-
容易的组合是需要的。
-
类可能需要方法的多个实现。
-
委托是事件的基础。
那不言而喻了,最主要的是在事件的设计模式中会用到。
委托定义:
委托定义有关键字Delegate ,委托类型的声明与方法签名相似。 它有一个返回值和任意数目任意类型的参数
delegate void 委托(); delegate void 参数委托(string Msg);
public void 委托方法() { 委托 委托1 = new 委托(委托要调用的方法); 委托1(); } public void 委托要调用的方法() { MessageBox.Show("委托要调用的方法"); } public void 委托参数方法(string Msg) { 参数委托 委托2 = new 参数委托(委托参数要调用的方法); 委托2(Msg); } public void 委托参数要调用的方法(string Msg) { MessageBox.Show("参数返回值" + Msg); }
B:匿名方法
匿名方法是委托的另一种表现方式,创建匿名方法实际上是一种将代码块作为委托参数传递的方式,由于使用匿名方法无需创建单独的方法,因此可减少对委托进行实例化的编码开销。
匿名方法定义:
Delegate(无参或者有参){方法体};
参数的有无要与所定义的委托相对应
delegate void 匿名方法(string Msg); delegate void 匿名方法无参数(); public void 匿名方法例子() { 匿名方法 匿名 = delegate (string msg) { MessageBox.Show(msg); }; 匿名("匿名"); } public void 匿名方法无参数例子() { 匿名方法无参数 st = delegate () { SayHello(); SayHello1(); }; st(); }
C:Action委托
此委托可用于将方法作为参数传递而不用显式声明自定义委托。 封装的方法必须对应于此委托定义方法签名。 这意味着,封装的方法必须具有任何参数,没有返回值
Action定义:
有关键字Action
public void Action例子() { Action ac = new Action(SayHello); ac(); } public void Action泛型例子() { Action<int, int> acadd = new Action<int, int>(ActionAdd加法); acadd(1, 2); }
D:Func委托
可以使用此委托来表示的方法,而无需显式声明自定义的委托作为参数进行传递。 封装的方法必须对应于此委托定义的方法签名。
public void Func例子() { Func<int, int, int> FuncAdd = new Func<int, int, int>(FuncAdd加法); MessageBox.Show(FuncAdd加法(5, 5).ToString()); } public int FuncAdd加法(int x, int y) { return x + y; }
E:Lambda拉姆达表达式
Lambda 表达式是一种可用于创建 委托 或 表达式目录树 类型的 匿名函数 。 通过使用 lambda 表达式,可以写入可作为参数传递或作为函数调用值返回的本地函数。
表达式位于 => 运算符右侧的 Lambda 表达式称为“表达式 lambda”。 表达式 lambda 广泛用于表达式树的构造。 表达式 lambda 会返回表达式的结果,并采用以下基本形式:
(input-parameters) => expression
仅当 lambda 只有一个输入参数时,括号才是可选的;否则括号是必需的。 括号内的两个或更多输入参数使用逗号加以分隔:
(x, y) => x == y
而以上的所有委托都能用拉姆达表达式来实现:
//常见委托写法 委托 委托1 = () => 委托要调用的方法(); 委托1(); //两种写法 参数委托 委托2 = (string msg) => 委托参数方法(msg); 委托2("msg"); 参数委托 委托3 = msg => { 委托参数方法(msg); }; 委托3("msg"); //匿名方法 匿名方法无参数 委托4 = () => { SayHello(); SayHello1(); }; 匿名方法 委托5 = msg => { SayHello(); SayHello1(); }; //Action委托 Action<int, int> action = (int x, int y) => ActionAdd加法(x, y); action(5, 8); //Func委托 Func<int, int, int> func = (int x, int y) => FuncAdd加法(x, y); func(8, 9).ToString();