学习笔记:在unity中理解C#委托(二)

本文深入探讨C#中的委托,强调其作为方法参数的优势,如动态调用。同时指出多播委托可能导致的方法重置问题和内存泄漏风险。介绍了Action和Func泛型委托的使用,包括它们的参数和返回值类型。通过实例展示了Func委托在Unity中的应用,包括方法作为参数的使用,以提高理解。
摘要由CSDN通过智能技术生成

今天继续来学习委托
一,委托好在哪里
因为委托是一种引用类型,所以我们可以把委托当作方法的参数,传递到方法里面去,使用了这个传进来的委托间接的去调用了我们委托所封装的某个方法,这样就形成了一种动态调用方法的代码。
二,委托的缺点
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老师,感兴趣的各位请点击原视频并一键三连,谢谢各位!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值