如何理清 C# 委托、事件、Action、Func?
想要理清 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 换成了带有返回值的而已。
而且系统还贴心的帮我们加了泛型参数,这样使用起来就更方便了,可以使用任何我们自定义的参数,只要参数数量匹配即可。
转载声明:本文来源于网络,不作任何商业用途
全部评论
暂无留言,赶紧抢占沙发