一、概念
1、委托:将方法以变量的形式传递,并且以方法的形式执行。他是类,是引用类型。
2、事件:功能被限制的一个委托变量。它的类型是委托类型。
3、委托的三种形式
3.1、delegate: 四步(声明,实例化,注册方法,调用)
3.2、Action:添加的方法不能有返回值
3.3、Func: 添加的方法要有返回值
3.4、lamda表达式:方法只使用一次,没有多次使用的话使用
二、案例
1、委托、匿名函数、lamda表达式、事件测试
public class DelegateAndEventTest : MonoBehaviour
{
//声明 带一个参数并且无返回值的委托
public delegate void TestDlg(string content);
//TestDlg 类型的事件
public event TestDlg TestDlgEvent;
// Start is called before the first frame update
void Start()
{
//委托的解释:将方法以变量的形式传递,并且以方法的形式执行
TestDlg dlg = TestDlg01;
dlg += TestDlg02;//委托链
dlg -= TestDlg02;
dlg("测试");
//匿名函数:方法只使用一次,没有多次使用的话使用匿名函数
TestDlg dlg1 = delegate (string name)
{
Debug.Log(name+"这是匿名函数");
};
dlg1("测试");
//lamda表达式
TestDlg dlg2 = (name) =>
{
Debug.Log(name+"这是lamda表达式");
};
dlg2("测试");
//事件 功能被限制的一个委托变量 它的类型是委托类型
//通过+=添加通知订阅事件
//通过-=取消通知订阅事件
//注册事件
TestDlgEvent += DelegateAndEventTest_TestDlgEvent;
//SayHelloEvent -= DelegateAndEventTest_SayHelloEvent;
if (TestDlgEvent != null)
{
TestDlgEvent("测试");//调用事件
}
}
private void DelegateAndEventTest_TestDlgEvent(string content)
{
Debug.Log(content + "这是事件");
}
public void TestDlg01(string content)
{
Debug.Log(content + "这是委托01");
}
public void TestDlg02(string content)
{
Debug.Log(content + "这是委托02");
}
}
2、Action测试
public class ActionTest : MonoBehaviour
{
private delegate void MyDlg(string s);//声明
MyDlg mydlg;//实例
//使用Action直接把委托的声明给绕过去了,直接实例化一个Action
private Action<string> _actionTest;
void Start()
{
mydlg += DlgTest;
mydlg?.Invoke("执行委托");//?的意思就是mydlg不为空执行后面的语句,为空不执行
_actionTest += DlgTest;
_actionTest?.Invoke("执行Action");
}
private void DlgTest(string content)
{
Debug.Log(content);
}
}
3、Func测试
public class FuncTest : MonoBehaviour
{
private Func<string, string, int> _funcSum;
void Start()
{
//var是隐式类型,根据后面的代码去推断是哪一种类型
_funcSum += ParseSum;
var sum= _funcSum?.Invoke("4","5");
Debug.Log(sum);
}
private int ParseSum(string s1,string s2)
{
int sum = int.Parse(s1) + int.Parse(s2);
return sum;
}
}