帮你理清 C# 委托事件ActionFunc
Posted Unity官方平台
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了帮你理清 C# 委托事件ActionFunc相关的知识,希望对你有一定的参考价值。
想要理清 C#委托、事件、Action、Func 这些名词的区别,我们先搞清楚他们的关系。
第一步
所有的名词,都是基于委托产生的,所以这个委托其实就是基础,先要明白什么是委托。
委托的关键词是 delegate ,具体在代码中的使用方法如下:
为了方便新人理解,这里我直接用通俗点点方式说一下什么是委托:
委托(delegate)其实就是函数的模版,这个模版可以用来放入各种格式和他相同的函数,也就是这些真实函数的引用,就好比你声明了一个int的变量, public int TestInt;那么之后你就可以给这个TestInt进行赋值,只要是整数都可以,那这里其实也是一个模版,只是你放入的只能是整数罢了,委托也可以用这种思路去理解,其实就是把符合模版格式的函数放进去,这样你就可以直接通过模版来调用你想调用的函数了,至于为什么要这么做,我们往后在看。
PS:以上说法只是为了方便刚接触代码的新人理解用的,如果是已经有代码基础或者知道什么是委托的同学可以直接往下看,或者有想真正理解委托底层到底是什么的,可以自己查阅相关书籍,其实委托编译之后还是一个类,里面包含了自己的实例和一些虚方法,有兴趣的同学可以看《CLR Via C#》等相关书籍。
第二步
我们现在知道了什么是委托,接下来说事件,其实事件就是委托的一种特殊封装,事件本身其实就是一种特殊的委托。
为了方便大家快速理解,直接上代码,先来看下普通的委托如何使用:
这张图简单的说了一下委托的用法,那么事件其实就是在上图的使用过程中加了一个关键字 event,如图:
细心的同学应该已经发现了,在使用上加没加 event 好像没有任何区别。是的,表面看似是这样,但是在实际使用的过程中,如果加了 event 的情况下,在其他类中使用带 event 字段的委托是不能直接使用 = 赋值符号的,只能使用 + =。注意这里说的是其他类中,如果直接在声明 event 的类中还是可以直接使用 = 赋值的。
那么好奇同学又要问啦,为什么呢?其实原因也很简单,当你在委托声明的时候加了 event 字段之后,直接赋值的操作会变成 private 权限,那么自然在其他类中就无法直接赋值了,为什么 + = 和 - = 就可以呢?那是因为 + = 和 - = 重写变成了 add 和 remove 的方法,是 public 的,所以可以在外部调用,想了解底层的同学也可以查找相关资料。
总之一句话,事件就是特殊的委托,直观的区别就是在外部类中无法直接使用 = 赋值,在我看来好处就是防止外部直接赋值导致所有的注册丢失,有一定的安全性。
第三步
我们现在知道了什么是委托,什么是事件,终于要搞明白什么是 Action、Func 啦!
惯例,先来看看 C# 中是怎么使用 Action、Func 的吧!上代码:
用法我简单的写了一下,其实 Action 就是一个 System 库自带的已经帮你声明好的委托,因为我使用 Action 的时候并没有声明 delegate 这一步的操作,而是直接使用 public Action test Action1 来声明使用,看到这里迷惑的你是不是已经大概清楚了呢?为了让你看的更明白,我直接把 Action 到底是个啥写几个事例出来:
public delegate void Action<in T1 >(T1 arg1);
public delegate void Action<in T1 ,in T2>(T1 arg1,T2 arg2);
public delegate void Action<in T1 ,in T2,in T3>(T1 arg1,T2 arg2,T3 arg3);
……..
一直写到 16 个参数。
其实这些代码就是 Action 的声明,只是写在了系统自带的库里,所以我们才能直接拿来用,其实就是系统帮我们做了第一步,我们可以直接用,很方便。
Func 同理,只是把 void 换成了带有返回值的而已。
而且系统还贴心的帮我们加了泛型参数,这样使用起来就更方便了,可以使用任何我们自定义的参数,只要参数数量匹配即可。
看到这里小伙伴们如果还有疑惑的地方可以留言告诉我,我也会尽我所能解答,如果对你有帮助麻烦关注一波哦!
长按关注
第一时间了解Unity引擎动向,学习最新开发技巧
点击“阅读原文”,跳转社区原文哦
以上是关于帮你理清 C# 委托事件ActionFunc的主要内容,如果未能解决你的问题,请参考以下文章