委托
委托
1、委托可以把方法当做(方法的)参数来传递。
所有人都知道作为方法的参数传值需要定义一个类型,比如:int、folt、string,那么如果想要方法当做参数传值呢?它也需要定义个一个类型,而这个类型就是委托类型。
委托语法格式
上面也说了想要把方法当做方法的参数传递就需要定义一个委托类型,那么委托类型该怎么定义呢!
public delegate void CalcDelegate(int a, int b);
-- 访问修饰符 delegate(关键字) 返回值类型 委托名称(参数列表);
1、委托声明的关键字是: delegate
2、委托声明的位置可以在类外,也可以在类内;
3、声明的委托要和要绑定的方法的 “签名” 保持一致;
“签名”指:由方法名称和一个参数列表(方法的参数个数、顺序和类型)组成。
注意:方法的签名并不包括方法的返回值。但是委托返回值类型也得相同;而返回值这里主要是与函数重载区分开来(因为函数重载时改变函数的返回值类型而不改变参数列表是无法重载函数的)
怎么定义我们也知道了,但是怎么用呢,又有什么好处呢!来看下面一段代码,很普通的加减乘除。
public class Calc : MonoBehaviour
{
private void Start()
{
int a = 10;
int b = 2;
JiaFa(a, b);
JianFa(a, b);
ChengFa(a, b);
ChuFa(a, b);
}
private void JiaFa(int a, int b)
{
Debug.Log(string.Format("{0} + {1} = {2}",a, b, a + b));
}
private void JianFa(int a, int b)
{
Debug.Log(string.Format("{0} + {1} = {2}", a, b, a - b));
}
private void ChengFa(int a, int b)
{
Debug.Log(string.Format("{0} + {1} = {2}", a, b, a * b));
}
private void ChuFa(int a, int b)
{
Debug.Log(string.Format("{0} + {1} = {2}", a, b, a / b));
}
}
输出结果也很正常OK!!!:
我们再来定义个委托看看有什么不同!!!!!!!
// 声明一个委托
public delegate void CalcDelegate(int a, int b);
public class Calc : MonoBehaviour
{
private void Start()
{
int a = 10;
int b = 2;
Operation(a, b,JiaFa);
Operation(a, b, JianFa);
Operation(a, b, ChengFa);
Operation(a, b, ChuFa);
}
// 将方法当做方法的参数传递,这样我们只需要调用这一个方法把相应的操作传递进去就可以了
private void Operation(int a, int b, CalcDelegate calDel)
{
calDel(a, b);
}
private void JiaFa(int a, int b)
{
Debug.Log(string.Format("{0} + {1} = {2}",a, b, a + b));
}
private void JianFa(int a, int b)
{
Debug.Log(string.Format("{0} - {1} = {2}", a, b, a - b));
}
private void ChengFa(int a, int b)
{
Debug.Log(string.Format("{0} * {1} = {2}", a, b, a * b));
}
private void ChuFa(int a, int b)
{
Debug.Log(string.Format("{0} / {1} = {2}", a, b, a / b));
}
}
输出结果也正常OK!!!!!
看到这时就想骂爹了、搞什么鬼,没使用委托之前什么操作就直接调用可以了,这用了委托之后还TM多出几行代码!!!!!!
再来看下面的代码:
// 声明一个委托
public delegate void CalcDelegate(int a, int b);
public class Calc : MonoBehaviour
{
private void Start()
{
int a = 10;
int b = 2;
CalcDelegate calDel;//定义一个委托变量
calDel = JiaFa;//为这个变量赋值
calDel(a, b);//使用委托
}
private void JiaFa(int a, int b)
{
Debug.Log(string.Format("{0} + {1} = {2}",a, b, a + b));
}
private void JianFa(int a, int b)
{
Debug.Log(string.Format("{0} - {1} = {2}", a, b, a - b));
}
private void ChengFa(int a, int b)
{
Debug.Log(string.Format("{0} * {1} = {2}", a, b, a * b));
}
private void ChuFa(int a, int b)
{
Debug.Log(string.Format("{0} / {1} = {2}", a, b, a / b));
}
}
输出结果毫无疑问就是 10 + 2 = 12 了。
到这里是不是感觉有点神奇了呢!!!
前面也说过把方法当做方法的参数传递就需要一个类型,而类型也就是委托,也就意味着我们像定一个普通的 string 或 int 类型的变量一样,来使用委托定义一个变量,然后把方法当做数据赋值给该变量。
1、委托类型 变量名称;这种方式定义一个委托类型的变量、
2、变量名称 = 方法名; 使用这种方式来给变量赋值、
3、变量名称([参数列表]);这种方式来执行变量,就等于是间接的执行了存放在该委托变量中的方法。
多播委托
委托变量和普通的变量不同,普通变量只能存放一个数据,而委托变量是一个“委托链”,里面可以存放多个数据。委托是可以同时赋值多个方法的,即委托对象可以绑定多个方法即多播委托
语法格式:
1、委托变量赋值,第一次使用 “=” 号;
2、第二次开始就要使用 “+=” 进行添加;如果你还是用 “=”,之前存在于该委托链内的方法,就会全部丢失,效果类似于重置;
3、可以使用 “-=” 把委托链中的某个方法移除;
4、调用这个委托变量,执行的时候,是按赋值的先后顺序执行的;执行的时候回把添加到该委托链中的方法全部依次执行。
如下面代码:
private void Start()
{
int a = 10;
int b = 2;
CalcDelegate calDel;//定义一个委托变量
calDel = JianFa;//为这个变量赋值
calDel += JianFa;
calDel += ChengFa;
calDel += ChuFa;
calDel(a, b);//使用委托
}
输出结果也OK!!!!!!!
当然了、这还不是最简单的、后面还有匿名函数、lamda表达式,有些很多的代码只需一句代码就可以完成相同的工作。