您的位置:软件 > 开发者网络 > 微软开发专栏 > Visual Studio.net专栏 > VB.net > 正文
Visual Basic.NET进行事件编程
[文章信息]
作者:陶刚编译
时间:2004-02-06
出处:yesky
责任编辑:方舟
[文章导读]
本文的目标就是让你了解事件在低层是怎样工作的
advertisement
热点推荐
· 11.10软件精选 FW实用设计
· IE最新安全漏洞补救几大措施
· M牛的网络生活之下载篇
· Norton Ghost 9.0全新体验
· InstallShield简明使用教程之前言
[正文]

上一页  1 2 3 4  下一页

  引发事件

  现在我们修改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字段的显式调用。

  假设BankAccount对象有三个已经注册的事件处理程序用于接收LargeWithdraw事件的通知。如果你使用RaiseEvent关键字触发事件并且调用列表中的第二个事件处理程序出现了错误会发生什么事情呢?包含RaiseEvent语句的代码行将收到一个运行时错误,但是你没有办法调试是哪一个事件处理程序产生的。另外,第二个事件处理方法产生的异常没有办法处理并按希望继续运行第三个事件处理程序。

Sub Withdraw(ByVal Amount As Decimal)
'如果需要的话就发送通知
If (Amount > 5000) AndAslo (Not LargeWithdrawEvent Is Nothing) Then
Dim handler As LargeWithdrawHandler
For Each handler In LargeWithdrawEvent.GetInvocationList()
Try
handler.Invoke(Amount)
Catch ex As Exception
'处理异常
End Try
Next
End If
'执行撤消
End Sub


图3.使用私有委托字段

  但是如果编程访问私有的LargeWithdrawEvent字段,你就可以使用更好的方式处理一个事件处理方法产生的异常。查看图3中的代码,你会发现,处理较低层次并且对私有委托字段编程提供了额外的控制能力。你可以轻易地处理异常并继续执行列表后面地事件处理程序。这种技术比RaiseEvent语法明显的好处,RaiseEvent语法中事件处理方法产生的异常阻止了列表后面的其它事件处理程序的执行。


上一页  1 2 3 4  下一页

·"WAP天极之IT新闻资讯,50万元等你拿"    ·天极WAP之游戏狂图,50万元等你下载

天极社区邀请您:写博客日记  上传相片   论坛聊天  订阅电子杂志  推荐网摘   免费图铃工具
笔名:   请您注意:

 遵守国家有关法律、法规,尊重网上道德,承担一切因您的行为而直接或间接引起的法律责任。

 天极网拥有管理笔名和留言的一切权利。
评论:
 

发表评论推荐给朋友我想参加相关培训打印我对此感兴趣订阅电子杂志
相关内容阅读排行榜
  • 基于VB.NET的多线程编程实现
  • Visual Basic.Net实现TCP协议
  • 在VB.NET中应用SQLDMO
  • VB.NET实现五子棋的人工智能
  • VB.NET数据库编程中的图形处理
  • VIA驱动问题导致DVD刻录失败
  • [配置推荐]学生型闪龙配置
  • 11.10软件精选 FW实用设计
  • 精英主板全面迈进P5时代
  • 详解11月三大硬件杀手游戏及四大凶器
  • 选硬盘 用好希捷互动存储专家
  • NDS十大最受期待游戏
  • 中国星际个人联赛第6轮综述
  • Advertisement