一、最简单的委托例子
委托(delegate):类似于C语言函数作为参数传递,语法:访问修饰符 delegate 返回值类型 委托名称(参数列表);
关于委托最宽泛的理解:
- 委托声明的关键字:delegate
- 委托声明的位置可以在类外,也可以在类内,定义在类外同命名空间内其他的类也可以使用这个委托;定义在类内则是作为类的成员存在,只能在当前类中访问
- 如果方法A的返回值类型以及参数都和委托B完全相同,那么方法A就被委托B所绑定,也就是说声明的委托要和绑定的方法返回值及参数列表要一致
一个例子绝对能很快的例子(代码中有注释):
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public delegate int Func(int a, int b); //声明一个委托
public class CsharpTp : MonoBehaviour
{
private void Start()
{
Debug.Log(Calc(5, 3, Add)); //8
Debug.Log(Calc(5, 3, Mul)); //15
//Debug.Log(Calc(5, 3, Del)); 非法,Del的返回值和委托Func声明的不同!
}
public int Calc(int a, int b, Func calc) //calc就是你要调用的函数名,可以是下面两个的其中一个(Add or Mul)
{
return calc(a, b);
}
public int Add(int a, int b)
{
return a + b;
}
public int Mul(int a, int b)
{
return a * b;
}
public float Del(int a, int b)
{
return 1.0f * a / b;
}
}
二、多播委托
多播委托:假设你要依次执行10个同类型的方法,这个时候你可能不得不写10条语句?这个时候多播委托就可以帮你解决这个问题,只需要一条语句就可以解决
委托其实也算是一种数据类型,可以像定义一个普通的 string 或 int 类型的变量一样,以当前委托定义一个变量,然后把方法当成数据赋值给该变量,具体步骤如下:
- 委托类型 变量A:定义一个委托类型变量
- 变量A = 方法名:给委托变量指定方法(注意等号慎用,它会将委托先前绑定的方法全部解绑)
- 变量A += 方法名:给委托变量添加方法,是的委托变量你可以理解为是一个数组,里面可以添加多个方法
- 变量A -= 方法名:给委托变量取消绑定的方法,步骤③④一般依据情况执行多次
- 变量A([参数列表]);按顺序执行存放在该委托变量中的所有方法
非常简单的一个例子如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public delegate int Func(int a, int b); //声明一个委托
public class CsharpTp : MonoBehaviour
{
private void Start()
{
Func func;
func = Add;
func += Mul;
Debug.Log(func(3, 5)); //fun(3,5)会依次执行Add、Mul两个方法,返回值为最后一个方法的返回值
}
public int Add(int a, int b)
{
Debug.Log("执行函数Add");
return a + b;
}
public int Mul(int a, int b)
{
Debug.Log("执行函数Mul");
return a * b;
}
public float Del(int a, int b)
{
return 1.0f * a / b;
}
}