C#学习总结 事件(一)深入多播委托

时间:2022-05-30 04:40:29

  好久没写文章了,之前说要总结一下事件这个概念,今天趁着工作闲暇,谈谈我对C#事件事件的理解,如果有什么不对的地方,望各位大神指点。

  真正的理解事件,还是要很好的理解委托,不然你永远不会明白很多教科书上的一句话:事件是一个特殊的委托,今天我们就来探寻一下:为什么说事件是一个特殊的委托,之前我谈论了委托的一些相关基础知识,其实还有一些关于委托更深层次的东西没有说,那么在今天谈事件这个知识之前还是继续从委托说起:

  不知道有没有人了解C语言的函数指针这个概念,,使用函数指针来创建回调函数,使用回调可以把函数回调给程序中的另一个函数。但函数指针只是简单地把地址指向另一个函数,并不能传递其他额外信息。而在.NET中,在大部分时间里都没有指针的身影,因为指针被封闭在内部函数当中。可是回调函数却依然存在,它是以委托的方式来完成的。委托可以被视为一个更高级的指针,它不仅仅能把地址指向另一个函数,而且还能传递参数,返回值等多个信息。系统还为委托对象自动生成了同步、异步的调用方式,开发人员使用BeginInvoke、EndInvoke 方法就可以抛开 Thread 而直接使用多线程调用 。其实这才是C#委托的本质由来,之前总结了那么多关于委托的概念,我始终没有从C语言的角度去解析委托,是因为一开始就吧上面的概念展示给初学者,其实是很不利于我们更好的,更深刻的去学习委托这个概念的。对于一个.net程序猿来说,适当的学习C语言是更有利于我们去理解C#高级的语法的。废话不多说,我们定义了一个名为MyDel委托,通过反射来遍历委托内部的属性和方法:

PropertyInfo[] pro = typeof(MyDel).GetProperties(); MethodInfo[] med = typeof(MyDel).GetMethods(); //MyDel a = new MyDel((name) => { return ""; }); Console.WriteLine("--------------------属性"); foreach (var item in pro) { Console.WriteLine(item.Name); } Console.WriteLine("--------------------方法"); foreach (var item in med) { Console.WriteLine(item.Name); }


得到如下结果:

C#学习总结 事件(一)深入多播委托