欢迎来到天天文库
浏览记录
ID:22870864
大小:1.07 MB
页数:46页
时间:2018-11-01
《分析委托和事件》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、本篇文章将为你介绍一下Delegate的使用方式,逐渐揭开C#当屮事件(Event)的由来,它能使处理委托类型的过程变得更加简单。还将为您解释委托的协变与逆变,以及如何使用Delegate使Observer(观察者)模式的使用变得更加简单。在事件的介绍上,会讲述事件的使用方式,并以ASP.NET的用户控件为例子,介绍一下自定义事件的使用。最后一节,将介绍Predicate>Action、FunccT,TResult〉多种泛型委托的使用和Lambda的发展过程与其使用方式。因为时间仓促,文中有错误的地方敬请点评。一、委托类型的来由二、建2、mbda表达況一、委托类型的来由记得在使用C语言的年代,整个项目屮都充满着针指的身影,那时候流行使用函数指针来创建回调函数,使用回调可以把函数回调给程序中的另一个函数。但函数指针只是简单地把地址指向另一个函数,并不能传递其他额外信息。在.NET屮,在大部分时间里都没有指针的身影,因为指针被封闭在内部函数当屮。可是回调函数却依然存在,仑是以委托的方式來完成的。委托可以被视为一个更髙级的指针,仑不仅仅能把地址指向另一个函数,而且还能传递参数,返回值等多个信息。系统还为委托对象自动生成了同步、异步的调用方式,开发人员使用Beginlnvoke、EndInvoke方法就可以抛开Thread而直接使用多3、线程调用。冋到目录二、建立委托类使用delegate就可以直接建立任何名称的委托类型,当进行系统编译时,系统就会自动生成此类型。您可以使用delegatevoidMyDelegate()方式建立一个委托类,并使用ILDASM.exe观察其成员。由ILDASM.exe中可以看到,它继承了System.MulticastDelegate类,并自动生成Beginlnvoke、Endlnvoke、Invoke等三个常用方法。Invoke方法是用于同步调用委托对象的对应方法,而巳eginlnvoke、Endlnvoke是用于以异步方式调用对应方法的。对于异步调用的使用方式,对以参考:C#综合揭秘——细说4、多线程1publicclassMyDelegate:MulticastDelegate2{3//同步调用委托方法4publicvirtualvoidInvoke();5//异步调用委托方法6publicvirtualIAsyncResultBeginInvoke(AsyncCallbackcallback,objectstate);7publicvirtualvoidEndInvoke(IAsyncResultresult);8}MulticastDelegate是System.Delegate的子类,它是一个特殊类,编译器和其他工具可以从此类派生,但是自定义类不能显式地从此类进行派生。它支持5、多路广播委托,并拥有一个带有链接的委托列表,在调用多路广播委托时,系统将按照调用列表中的委托出现顺序来同步调用这些委托。MulticastDelegate具有两个常用属性:Method、Target。其中Method用于获取委托所表示的方法Target用于获取当前调用的类实例。MulticastDelegate有以下几个常用方法:说明方法名称Clone创建委托的浅表副木。GetlnvocationList按照调用顺序返回此多路广播委托的调用列表。GetMethodlmpl返M由当前的MulticastDelegate农示的静态方法。GetObjectData用序列化该实例所需的所有数据填充Se6、rializationlnfo对象。MemberwiseClone创建当前Object的浅表副本。Removelmpl调用列表中移除与指定委托相等的元索MulticastDelegate与Delegate给委托对象建立丫强大的支持,下面14各位详细介绍一下委托的使用方式。回到目录三、委托使用方式3.1简单的委托当建立委托对象时,委托的参数类型必须与委托方法相对应。只要向建立委托对象的构造函数屮输入方法名称example.Method,委托就会直接绑定此方法。使用myDelegate.Invoke(stringmessage),就能显式调用委托方法。但在实际的操作中,我们无须用到Invoke方法7、,而只要直接使用myDelegate(stringmessage),就能调用委托方法。123456789101112131415161718classProgram{delegatevoidMyDelegate(stringmessage);publicclassExample{publicvoidMethod(stringmessage){MessageBox.Show(message);}}s
2、mbda表达況一、委托类型的来由记得在使用C语言的年代,整个项目屮都充满着针指的身影,那时候流行使用函数指针来创建回调函数,使用回调可以把函数回调给程序中的另一个函数。但函数指针只是简单地把地址指向另一个函数,并不能传递其他额外信息。在.NET屮,在大部分时间里都没有指针的身影,因为指针被封闭在内部函数当屮。可是回调函数却依然存在,仑是以委托的方式來完成的。委托可以被视为一个更髙级的指针,仑不仅仅能把地址指向另一个函数,而且还能传递参数,返回值等多个信息。系统还为委托对象自动生成了同步、异步的调用方式,开发人员使用Beginlnvoke、EndInvoke方法就可以抛开Thread而直接使用多
3、线程调用。冋到目录二、建立委托类使用delegate就可以直接建立任何名称的委托类型,当进行系统编译时,系统就会自动生成此类型。您可以使用delegatevoidMyDelegate()方式建立一个委托类,并使用ILDASM.exe观察其成员。由ILDASM.exe中可以看到,它继承了System.MulticastDelegate类,并自动生成Beginlnvoke、Endlnvoke、Invoke等三个常用方法。Invoke方法是用于同步调用委托对象的对应方法,而巳eginlnvoke、Endlnvoke是用于以异步方式调用对应方法的。对于异步调用的使用方式,对以参考:C#综合揭秘——细说
4、多线程1publicclassMyDelegate:MulticastDelegate2{3//同步调用委托方法4publicvirtualvoidInvoke();5//异步调用委托方法6publicvirtualIAsyncResultBeginInvoke(AsyncCallbackcallback,objectstate);7publicvirtualvoidEndInvoke(IAsyncResultresult);8}MulticastDelegate是System.Delegate的子类,它是一个特殊类,编译器和其他工具可以从此类派生,但是自定义类不能显式地从此类进行派生。它支持
5、多路广播委托,并拥有一个带有链接的委托列表,在调用多路广播委托时,系统将按照调用列表中的委托出现顺序来同步调用这些委托。MulticastDelegate具有两个常用属性:Method、Target。其中Method用于获取委托所表示的方法Target用于获取当前调用的类实例。MulticastDelegate有以下几个常用方法:说明方法名称Clone创建委托的浅表副木。GetlnvocationList按照调用顺序返回此多路广播委托的调用列表。GetMethodlmpl返M由当前的MulticastDelegate农示的静态方法。GetObjectData用序列化该实例所需的所有数据填充Se
6、rializationlnfo对象。MemberwiseClone创建当前Object的浅表副本。Removelmpl调用列表中移除与指定委托相等的元索MulticastDelegate与Delegate给委托对象建立丫强大的支持,下面14各位详细介绍一下委托的使用方式。回到目录三、委托使用方式3.1简单的委托当建立委托对象时,委托的参数类型必须与委托方法相对应。只要向建立委托对象的构造函数屮输入方法名称example.Method,委托就会直接绑定此方法。使用myDelegate.Invoke(stringmessage),就能显式调用委托方法。但在实际的操作中,我们无须用到Invoke方法
7、,而只要直接使用myDelegate(stringmessage),就能调用委托方法。123456789101112131415161718classProgram{delegatevoidMyDelegate(stringmessage);publicclassExample{publicvoidMethod(stringmessage){MessageBox.Show(message);}}s
此文档下载收益归作者所有