C#基础15:委托

一、最简单的委托例子

委托(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 类型的变量一样,以当前委托定义一个变量,然后把方法当成数据赋值给该变量,具体步骤如下:

  1. 委托类型  变量A:定义一个委托类型变量
  2. 变量A = 方法名:给委托变量指定方法(注意等号慎用,它会将委托先前绑定的方法全部解绑)
  3. 变量A += 方法名:给委托变量添加方法,是的委托变量你可以理解为是一个数组,里面可以添加多个方法
  4. 变量A -= 方法名:给委托变量取消绑定的方法,步骤③④一般依据情况执行多次
  5. 变量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;
    }
}
原创文章 1134 获赞 1439 访问量 61万+

猜你喜欢

转载自blog.csdn.net/Jaihk662/article/details/96895681