今天继续来学习委托
一,委托好在哪里
因为委托是一种引用类型,所以我们可以把委托当作方法的参数,传递到方法里面去,使用了这个传进来的委托间接的去调用了我们委托所封装的某个方法,这样就形成了一种动态调用方法的代码。
二,委托的缺点
1.多播委托容易人为失误,导致封装的所以方法重置。(多播委托:一个委托实例里封装了多个方法,方法重置:误把+=写成=,导致给委托实例添加方法的时候,后面的方法把前面的方法覆盖了)
private void OnEnable()
{
mydelegate01 = Blink;
mydelegate01 += ChangeColor;
mydelegate01 = Log;
}
此时mydelegate01内只有Log方法的引用。
2.过度使用会导致内存泄漏。
3.滥用会导致可读性下降,比如一个委托中嵌套另一个委托。
三,使用的情况
在95%的情况下,我们是不需要去为自己的项目声明自定义委托类型使用的。
我们用C#类库提供了两种委托:Action委托和Func委托
Action委托和Func委托,都为泛型委托(泛型会单独拿出一章讲)
Action委托,无返回值,可以有参数列表
Func委托,有返回值,可以有参数列表
取上一章的创建委托实例的代码:
public delegate void MyDelegate();
MyDelegate mydelegate01;
这个mydelegate01是无参无返回值的委托类型实例,那么我们可以用Action做出同样的效果:
Action mydelegate01;
Action和Func委托,都有16个重载,参数最多可以有16种类型。
四,在unity中试试Func委托
首先声明一个Func委托的mydelegate02,参数是前两个int型,返回值是后面的int型。
Func<int, int, int> mydelegate02;
再写一个方法,和mydelegate02的参数和返回值一致
private int add(int a, int b) //add
{
Debug.Log("add:" + (a + b));
return a + b;
}
add方法封装进mydelegate02,放入参数,执行
mydelegate02 = add;
mydelegate02(1, 2);
控制台输出
接下来试试方法做参数,增进理解
声明一个Func委托的mydelegate03,参数有两个,第一个参数是int型,第二个参数是【参数是两个int型,返回值是int型的Func委托】,返回值是int型
Func<int, Func<int,int,int>, int> mydelegate03;
再写一个方法,和mydelegate03的参数和返回值一致,这里参数Func在方法中并没有实际意义,仅仅作为一个参数
private int times(int x, Func<int,int,int> y)
{
Debug.Log("addtest:" + (x* mydelegate02(1,2)));
return x;
}
addtest方法封装进mydelegate03,放入参数,执行
mydelegate03 = times;
mydelegate03(3, mydelegate02);
控制台输出
先整理到这,下一章讨论委托的实际使用方法。
文章参考于:B站【委托•预备篇】
在这边感谢BeaverJoe老师,感兴趣的各位请点击原视频并一键三连,谢谢各位!