您的位置:学习中国 推荐教程 VB编程 正文
原作者:kuku 添加时间:2007-06-02 原文发表:2007-06-02 人气:112 来源:互联网

本文章共6190字,分4页,当前第2页,快速翻页:
 
-----------------------------------------------------------------------------------------------------------------------------------------------

本文提示:《解析Visual Basic.NET事件编程(2)》是本站编辑们为广大网友精选的实用文章,本文阐述了关于文章的相关理论,相对来说专业性强,但是本文只是针对于某个问题提出的见解与论述,未必能辐射到相关问题的方方面面,所以本文处理问题的方法仅仅为您提供一些参考。更多问题请查阅学习中国网其他栏目哦.

-----------------------------------------------------------------------------------------------------------------------------------------------



  Visual Basic .NET编译器为add_LargeWithdraw产生了实现代码,它接收以一个委托对象作为参数并通过调用委托类的Combine方法将它添加到处理程序列表。编译器也产生remove_LargeWithdraw的实现代码,它通过调用委托类的Remove方法从列表中删除一个处理方法。

  添加到类定义中的第四个成员表现了事件本身。你能在图2中定位名为LargeWithdraw的事件成员。它有一个向下的三角形。但是你必须注意这个事件成员不是一个真的与其它三个相似的物理事件,它是一个元数据成员。

  该元数据事件成员是有价值的,因为它通知编译器和其它开发工具该类支持.NET框架中的事件注册标准模式。该事件成员也包含注册和反注册方法的名字。这使Visual Basic .NET和C#等可管理语言的编译器能在编译时就发现注册方法的名称。

  当Visual Basic .NET发现类定义中包含事件时,它自动在产生事件处理程序的注册代码时生成该处理方法的框架定义。

  在讨论引发事件前,我将讲解建立用于定义事件的委托类型所涉及的限制。定义事件的委托类型不能有返回值,你必须使用Sub关键字而不能使用Function关键字:

'能被事件使用
Delegate Sub BaggageHandler()
Delegate Sub MailHandler(ItemID As Integer)

'不能被事件使用
Delegate Function QuoteOfTheDayHandler(Funny As Boolean) As String

  该限制有一个很好的原因。在绑定到多个处理方法的多点传送委托中使用返回值非常困难。多点传送委托的Invoke调用返回的值是调用列表中最后一个处理方法的值。可是捕获列表中前面的处理方法的返回值就不直接了,消除捕获多个返回值的需求使事件更容易使用。



  引发事件

  现在我们修改BankAccount类,使取款总额超过5000元限制时产生一个事件。引发LargeWithdraw事件的最简单途径使在某个方法、属性或构造函数的执行中使用RaiseEvent关键字。该语法与Visual Basic早期版本的语法相似,下面的代码从Withdraw方法中引发LargeWithdraw事件:

Class BankAccount

Public Event LargeWithdraw As LargeWithdrawHandler
Sub Withdraw(ByVal Amount As Decimal)
'如果需要的话就发送通知
If (Amount > 5000) Then
RaiseEvent LargeWithdraw(Amount)
End If
'执行撤消
End Sub
End Class

  尽管语法与Visual Basic早期版本相同,但是引发事件时发生的事情却不同了。当你使用RaiseEvent关键字引发一个事件时,Visual Basic .NET编译器产生必要的代码来运行每个事件处理程序。例如,你知道编译下面的代码时会发生什么吗?

RaiseEvent LargeWithdraw(Amount)

  Visual Basic .NET编译器扩充表达式成为代码,代码调用保存多点传送委托对象的私有字段上的Invoke方法。就是说,使用RaiseEvent关键字的效果与下面的代码相同:

If (Not LargeWithdrawEvent Is Nothing) Then
 LargeWithdrawEvent.Invoke(Amount)
End If

  注意Visual Basic .NET编译器产生的代码实施一个检查以确保LargeWithdrawEvent字段包含一个有效的对象引用。这是因为LargeWithdrawEvent字段的值将为空,直到第一个处理方法被注册。因此,产生的代码不会试图调用Invoke,除非至少有一个处理方法被注册了。

  你能够观察事件的引发。无论你使用RaiseEvent关键字或者程序中直接访问编译器自动产生的LargeWithdrawEvent字段都没有关系。两种访问产生相同的代码:

'这段代码
RaiseEvent LargeWithdraw(Amount)

'与下面的代码相同
If (Not LargeWithdrawEvent Is Nothing) Then
 LargeWithdrawEvent.Invoke(Amount)
End If

  大多数情况下使用RaiseEvent关键字,因为这种语法的输入少、代码简洁。但是当你需要更多控制时,可能会使用到LargeWithdrawEvent字段的显式调用。
 
本文章更多内容<<上一页 - 1 - 2 - 3 - 4 - 下一页>>
本页地址
收藏到:[收藏夹] [百度搜藏] [新浪ViVi] [POCO网摘] [ 和讯网摘] [好哦网摘] [Google书签]
               
[搜狐网摘] [365Key网摘] [天极网摘] [我摘] [博采网摘] [igooi网摘]
相关文章

VB.NET中对象的克隆
VB.Net编程入门之Hello World 入门篇
VB 神童教程第二章第九节——综合示例三
VB 神童教程第二章第八节——组合框控件
VB 神童教程第二章第七节——列表框控件
VB 神童教程第二章第六节——综合示例二
VB 神童教程第二章第五节——单选与复选控件
VB 神童教程第二章第四节-CommandButton控件
VB 神童教程第二章第三节——综合示例一
VB 神童教程第二章第三节——综合示例一
在VB.NET中获得功能加强的分类和查询数组
vb.net例程集锦
向SQL Server数据库添加图片和文字
多个窗体之间如何互相调用
如何拖动没有边框的窗体?
怎么让窗体透明后,控件不透明?
Video/ Audio压缩数据流播放技术
VB程序中处理随机事件
VB编程的必备技巧
VB6制作Win98风格的工具栏

相关评论


本文章所属分类:首页 推荐教程 VB编程   VB编程