帮你理清C#委托、事件、Action、Func

本文详细介绍了C#中的委托、事件、Action和Func的概念及其区别。委托是函数的模板,允许存储和调用符合特定签名的函数。事件是委托的特殊形式,增加了访问控制,防止外部直接修改。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 testAction1来声明使用,看到这里迷惑的你是不是已经大概清楚了呢?为了让你看的更明白,我直接把Action到底是个啥写几个事例出来: public delegate void 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换成了带有返回值的而已。而且系统还贴心的帮我们加了泛型参数,这样使用起来就更方便了,可以使用任何我们自定义的参数,只要参数数量匹配即可。
看到这里小伙伴们如果还有疑惑的地方可以留言告诉我,我也会尽我所能解答,如果对你有帮助麻烦关注一波哦!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值