3.委托,Action和Func的区别

学习视频链接1. http:// https://www.bilibili.com/video/BV1Q64y1i7K8/?share_source=copy_web&vd_source=06ee2cd6fe48dbc0d8b5e6edf445be9c

学习视频链接2. https://www.bilibili.com/video/BV163411S7QG/?spm_id_from=333.337.search-card.all.click&vd_source=c831b3a0ab31ed5f140c830c965b39cc

委托是一种类,是引用类型的数据类型;委托的功能:委托能存储具有相同返回值和参数列表的方法

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;
        }
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值