详细分析VB.NET WithEvents

开发 后端
这里介绍当对VB.NET WithEvents变量赋值的时候,会自动触发这个属性以绑定事件。我们所用的大部分事件响应都是1对1的,即一个过程响应一个事件,所以这种VB.NET WithEvents静态方法是非常有用的。

VB.NET经过长时间的发展,很多用户都很了解VB.NET WithEvents了,这里我发表一下个人理解,和大家讨论讨论。VB除了可以用C#那样的方法来处理事件响应以外,还有从VB5继承下来的独特的事件处理方式——VB.NET WithEvents。

我喜欢称这种事件处理方式为静态的事件处理,书写响应事件的方法时就已经决定该方法响应的是哪一个事件,而C#则是在代码中绑定事件的。比如下面这个最简单的例子:

  1. Public Class HandlerClass  
  2. Public WithEvents MyObj As EventClass  
  3.  
  4. Private Sub MyObj_MyEvent(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyObj.MyEvent  
  5. MsgBox("hello")  
  6. End Sub  
  7.  
  8. Public Sub New()  
  9. MyObj = New EventClass  
  10. End Sub  
  11. End Class 

代码中用到的EventClass是这样的:

  1. Public Class EventClass  
  2. Public Event MyEvent As EventHandler  
  3.  
  4. Protected Overridable Sub OnMyEvent(ByVal e As EventArgs)  
  5. RaiseEvent MyEvent(Me, e)  
  6. End Sub  
  7.  
  8. Public Sub Test()  
  9. OnMyEvent(New EventArgs)  
  10. End Sub  
  11. End Class 

我们来复习一下,这段代码隐式地给EventClass编写了两个方法——Add_MyEvent(EventHandler)和 Remove_MyEvent(EventHandler),实际上任何使用事件的上下文都是通过调用这两个方法来绑定事件和解除绑定的。C#还允许你书写自己的事件绑定/解除绑定的代码。

那么WithEvents是怎么工作的呢?VB.net的编译器在编译时自动将

  1. Public WithEvents MyObj As EventClass 

翻译成下面这个过程:

  1. Private _MyObj As EventClass  
  2.  
  3. Public Property MyObj() As EventClass  
  4. Get  
  5. Return _MyObj  
  6. End Get  
  7. Set(ByVal Value As EventClass)  
  8.  
  9. If Not (Me._MyObj Is Nothing) Then  
  10. RemoveHandler _MyObj.MyEvent, AddressOf MyObj_MyEvent  
  11. End If  
  12.  
  13. Me._MyObj = Value 
  14.  
  15. If Me._MyObj Is Nothing Then Exit Property  
  16.  
  17. AddHandler _MyObj.MyEvent, AddressOf MyObj_MyEvent  
  18.  
  19. End Set  
  20. End Property 

由此可见,当对VB.NET WithEvents变量赋值的时候,会自动触发这个属性以绑定事件。我们所用的大部分事件响应都是1对1的,即一个过程响应一个事件,所以这种VB.NET WithEvents静态方法是非常有用的,它可以显著增强代码可读性,同时也让VB.net中的事件处理非常方便,不像C#那样离开了窗体设计器就必须手工绑定事件。

不过在分析这段IL的时候,我也发现了VB.net在翻译时小小的问题,就是ldarg.0出现得过多,这是频繁使用Me或this的表现,所以我们在编码过程中一定要注意,除了使用到Me/this本身引用以外,使用它的成员时不要带上Me/this,比如Me.MyInt = 1就改成MyInt = 1,这样的小习惯会为你带来很大的性能收益。

【编辑推荐】

  1. 原理分析VB.NET开发控件
  2. 自己动手修改VB.NET支付宝接口
  3. 如何快速掌握VB.NET控件数组
  4. 描述VB.NET IDisplayer接口
  5. 事例概括VB.NET Display方法
责任编辑:佚名 来源: 51CTO.com
相关推荐

2009-10-10 15:19:43

VB.NET Web

2009-10-12 15:41:09

VB.NET动态代码

2010-01-07 17:00:38

VB.NET控件数组

2009-10-14 10:25:52

VB.NET读写文本文

2009-10-10 13:52:57

VB Update方法

2010-01-06 13:50:37

.NET Framew

2009-09-25 14:23:39

2009-09-28 10:39:01

Hibernate基础

2009-09-14 16:21:34

LINQ To XML

2009-09-09 09:48:43

Linq延迟加载

2009-06-18 14:00:51

2009-09-08 15:56:50

Linq使用Group

2009-11-20 13:11:44

Oracle XML数

2009-09-14 13:50:35

LINQ编程模型

2009-10-28 09:55:29

VB.NET MyCl

2009-03-24 08:30:54

AndroidGoogle移动os

2009-09-07 13:19:44

C#线程同步

2009-09-03 17:57:06

C#声明事件

2009-12-16 14:09:14

Visual Stud

2009-12-07 15:37:00

WCF控件
点赞
收藏

51CTO技术栈公众号