如何理清 C# 委托、事件、Action、Func?

2021-03-10
8799
1

想要理清 C#委托、事件、Action、Func 这些名词的区别,我们先搞清楚他们的关系。

 

第一步

 

所有的名词,都是基于委托产生的,所以这个委托其实就是基础,先要明白什么是委托。

 

委托的关键词是 delegate ,具体在代码中的使用方法如下:

 

 

为了方便新人理解,这里我直接用通俗点点方式说一下什么是委托:

 

委托实际上是函数的模板。此模板可用于放入具有相同格式的各种函数,即对这些实函数的引用。这就像声明一个int变量public int Testint;然后可以为这个Testint赋值。只要它是一个整数,它实际上就是一个模板。只是你放入的只能是整数罢了,委托也可以用这种思路去理解。实际上,就是将函数放在模板格式中,这样就可以通过模板直接调用要调用的函数。至于为什么要这么做,我们一起来看看:

 

第二步

 

我们现在知道了什么是委托,接下来说事件,其实事件就是委托的一种特殊封装,事件本身其实就是一种特殊的委托。

 

为了方便大家快速理解,直接上代码,先来看下普通的委托如何使用:

 

 

这张图简单的说了一下委托的用法,那么事件其实就是在上图的使用过程中加了一个关键字event,如图:

 

 

细心的学生应该发现,使用和不添加似乎没有区别。是的,看起来是这样的,但在实际使用过程中,如果添加了event,其他类中带有event字段的delegation不能直接使用=赋值符号,只能使用 =。注意,在其他类中,如果您直接在声明事件的类中,那么仍然可以直接使用=assignment。

 

又有同学要问啦,

 

为什么呢?其实原因也很简单,当你在委托声明的时候加了 event 字段之后,直接赋值的操作会变成 private 权限,那么自然在其他类中就无法直接赋值了,为什么 = 和 - = 就可以呢?那是因为 = 和 - = 重写变成了 add 和 remove 的方法,是 public 的,所以可以在外部调用,想了解底层的同学也可以查找相关资料。

 

总之一句话,事件就是特殊的委托,直观的区别就是在外部类中无法直接使用 = 赋值,在我看来好处就是防止外部直接赋值导致所有的注册丢失,有一定的安全性。

 

第三步

 

我们现在知道了什么是委托,什么是事件,终于要搞明白什么是 Action、Func 啦!

 

惯例,先来看看 C# 中是怎么使用 Action、Func 的吧!上代码:

 

 

用法我简单的写了一下,其实 Action 就是一个 System 库自带的已经帮你声明好的委托,因为我使用 Action 的时候并没有声明 delegate 这一步的操作,而是直接使用 public Action test Action1 来声明使用,看到这里迷惑的你是不是已经大概清楚了呢?为了让你看的更明白,我直接把 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 换成了带有返回值的而已。

 

而且系统还贴心的帮我们加了泛型参数,这样使用起来就更方便了,可以使用任何我们自定义的参数,只要参数数量匹配即可。

 

 

转载声明:本文来源于网络,不作任何商业用途

免责声明:本文内部分内容来自网络,所涉绘画作品及文字版权与著作权归原作者,若有侵权或异议请联系我们处理。
收藏

全部评论

您还没登录

暂无留言,赶紧抢占沙发
王氏教育是国内专业的CG数字艺术设计线上线下学习平台,在王氏教育,有原画、插画、漫画、影视、3D模型等培训课程,也有学习资源下载、行业社区交流。CG数字艺术学习,来王氏教育。
绘学霸iOS端二维码

IOS下载

绘学霸安卓端二维码

安卓下载

绘学霸微信小程序二维码

小程序

版权声明
本网站所有产品设计、功能及展示形式,均已受版权或产权保护,任何公司及个人不得以任何方式复制部分或全部,违者将依法追究责任,特此声明。
热线电话
18026259035
咨询时间:9:00~21:00
在线客服
联系网站客服
客服微信:18026259035
公司地址
中国·广州
广州市海珠区晓港中马路130号之19
绘学霸客户端(权限暂无,用于CG资源与教程交流分享)
王氏教育 王氏教育