委托是一种类,是引用类型的数据类型;委托的功能:委托能存储具有相同返回值和参数列表的方法
1.委托的用法
void PrintString(string s){
Debug.Log($"PrintString:{s}");
}
void PrintString01(string s){
Debug.Log($"PrintString01:{s}");
}
void PrintString02(string s){
Debug.Log($"PrintString02:{s}");
}
//声明、实例化、注册方法、调用
delegate void delegatePrint(string s);//声明委托
void Start()
{
delegatePrint dp = PrintString;//实例化委托、注册方法
dp += PrintString01;//注册方法
dp += PrintString02;//注册方法
dp.Invoke("dp");//调用 == PrintString("dp")+PrintString01("dp")+PrintString02("dp")
dp -= PrintString02;//取消方法
dp("dp");//调用
}
2.Action委托的用法
//action 不能有返回值 泛型委托
Action<string> actionPrint = new Action<string>(PrintString);//实例化委托、注册方法
Action<string,string> actionPrint01 = new Action<string,string>(PrintString03); //实例化委托、注册方法
actionPrint += PrintString01;//注册方法
actionPrint += PrintString02;//注册方法
actionPrint.Invoke("ap");
actionPrint("ap");//调用
3.Func委托的用法
//func 必须有返回值 泛型委托
Func<int, string> func = new Func<int, string>(PrintString04);//实例化委托、注册方法
func += PrintString04;//注册方法
var temp = func.Invoke(100);
temp = func(110);//调用
4.委托的模板方法和回调方法用法
通过让泛型委托类型作为参数,实现模板方法,可以提高代码的复用性。
回调方法是被调用方法,通过委托类型参数传入主调方法。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class StudyDelegate : MonoBehaviour
{
void Start()
{
PrintResult(RuleClass.RuleBigger,100,101);//模板方法
PrintResult(RuleClass.RuleEqual,100d,100d);//模板方法
PrintResult(delegate (int a,int b) { return false; },1,1);//匿名委托 模板方法
PrintResult( (a,b) => true,1,1);//lambda表达式 模板方法
}
delegate bool Rule<T>(T t01, T t02);//泛型委托
//此后若需要输出其他的Rusult,不需要改动该方法,只需要往其中传入符合Rule委托的方法即可
void PrintResult<T>(Rule<T> rule,T t01,T t02)//泛型委托类型作为参数。
{
Debug.Log($"Result:{rule.Invoke(t01, t02)}");//回调方法
}
static class RuleClass//静态类,存储用于判断的方法
{
static public bool RuleBigger(int i01, int i02)
{
return i01 > i02;
}
static public bool RuleSmaller(double i01, double i02)
{
return i01 < i02;
}
static public bool RuleEqual(double i01, double i02)
{
return i01 == i02;
}
}
}