最近做的项目中涉及到使用委托这一技术,由于之前接触过但是并没有完全弄清楚,于是写下这篇博客当做学习的记录。
这里抛出几个问题,当做学习的引导:
一.什么是委托?
二.委托怎么用?
三.什么是事件?
四. 什么是匿名方法?
五.什么是Lambda表达式?
六.什么是Action委托?
七.什么是Func委托?
一.什么是委托?
按照国际惯例,这里引用百度百科的解释:
委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。
通俗的讲,委托可以把方法当做(方法的)参数来传递。
二.委托怎么用?
1.委托语法
语法格式:
访问修饰符 delegate 返回值类型 委托名称(参数列表);
例如:
public delegate void CalcDelegate(int a,int b);//该委托用于a与b的计算
注意事项:
①.委托声明的关键字是:delegate
②.委托声明的位置不限定
③.声明的委托要和绑定的方法的返回值类型和参数列表类型一致
使用委托时,可以像定义一个普通的string或者int类型的变量一样,来使用委托定义一个变量,然后把方法当成数据赋值给变量。
基本步骤:
①.委托类型 变量名称; //这种方式定义一个委托类型的变量
②.变量名称 = 方法名; //使用这种方式来给变量赋值
③.变量名称([参数列表]); //这种方式来执行变量,就等于是间接的执行了存放在该委托变量中的方法
例如:
public delegate void CalcDelegate(int a,int b);
private CalcDelegate cal;//声明
cal = ADD;//赋值
cal();//执行
private void ADD(int a,int b){//该方法用于计算a+b的值,并且打印出来
Debug.Log(a+b);
}
2.多播委托语法
委托变量和普通变量有一点不同,普通变量只能存放一个数据,但委托变量是一个“委托链”,里面可以存放多个数据,委托链类似于“链表”。
语法格式:
①.委托变量赋值,第一次使用“=”号
②.第二次开始就要使用“+=”进行添加,使用“-=”进行移除
③.如果已经用“=”赋过值了,再使用“=”,相当于重置赋值,之前存在委托链中的方法全部丢失
④.调用这个委托变量,执行时按赋值的先后顺序执行,执行时会把添加到该委托链中的方法全部依次执行
public delegate void CalcDelegate(int a,int b);
private CalcDelegate cal;//声明
cal = ADD;//赋值
cal += DEL;//添加方法
cal();//执行
private void ADD(int a,int b){//该方法用于计算a+b的值,并且打印出来
Debug.Log(a+b);
}
private void Del(int a,int b){//该方法用于计算a-b的值,并且打印出来
Debug.Log(a-b);
}
三.什么是事件?
事件是在委托的基础上扩展而来的知识点,在原有的委托变量的基础上多了一个event关键字,这个委托变量就称为事件。在外部访问时,事件比委托更加安全(不能使用“=”号)。
语法格式:
public delegate void CalcDelegate(int a,int b);
private event CalcDelegate cal;//事件
四.什么是匿名方法?
匿名方法,从字面意思理解就是没有名字的方法或者没有方法名的方法。
开发过程中有的方法太简单,代码量不大,偶尔用一次,如果单独定义一个方法比较麻烦而且意义不大。所以这时候采用匿名方法。
语法格式:
委托类型 变量 = delegate([类型列表])
{
方法体;
};
例如:
public delegate void CalcDelegate(int a,int b);
private CalcDelegate cal;//声明
cal = delegate(int a,int b)//输出a+b的和
{
Debug.Log(a+b);
};
五.什么是Lambda表达式?
一.基本概念
①.Lambda表达式,是一种代码的语法格式
②.Lambda表达式是对匿名方法语法格式的进一步简化
③.Lambda表达式可以理解为匿名方法的升级版
2.Lambda表达式语法
<1>.语法格式
委托类型 变量 =([参数列表])=>{方法体;};
<2>.语法格式分析
①.“=>”是Lambda表达式特有的符号,读为:goes to
②.若没有参数列表,()不能省略,如:()=>
③.若参数列表中只有一个参数,()可以省略
④.若方法体内只有一句代码,可以省略代码块符号,即不用写{ }
六.什么是Action委托?
Action委托是Lambda表达式的特例,最显著的特征是Action委托无返回值。
在使用Action前,必须引入"using System;"命名空间。
Action:是一个无参无返回值的内置委托类型
语法格式:
访问修饰符 Action 变量名;
例如:
private Action cal;//无参数
cal = () => Debug.Log("啥都没有");
Action<T>:有参数(1~4),无返回值
语法格式:
访问修饰符 Action<参数类型1 参数1,参数类型2 参数2,参数类型3 参数3,参数类型4 参数4> 变量名;
例如:
private Action<int,int> cal;//两个参数
cal = (int a,int b) => Debug.Log(a+b);//定义一个输出a+b的值的方法
cal(1,2);//计算1+2的值并输出
七.什么是Func委托?
Func委托是Lambda委托的特例,与Action委托不同,Func委托有返回值,Action委托无返回值。
Func委托其余方面与Action委托完全一样,具体用哪一种委托类型,依据是否有返回值。
例如:
private Func<int,int> cal;//两个参数
cal = (int a,int b)=>{ return a+b };//定义计算a与b和的方法
int result = cal();//将结果赋值给result
Debug.Log(result);//打印输出