c与cvb.net的简单介绍( 四 )


//调用
func(something);
//换指向另外一个函数
func=this.SampleFunction2
然而VB中,委派类型就像是一般的对象,有它的方法,与函数本身明显不同 。你不能将过程的名字直接赋给一个委派类型的对象 , 而必须使用AddressOf运算符,下面的例子就是上文C#程序的VB版 , 注意那些实现不同的地方:
Public Delegate Sub FuncType(ByVal eAs Object)
...
Dim func As FuncType
func=New FuncType(AddressOf Me.SampleFunc1)
‘调用
func.Invoke(something)
‘换指向另外一个函数
func=AddressOf Me.SampleFunction2
5、事件处理 。这是两种语言最大的差别之一,VB传承以前版本强大的事件处理机制,许多语法都比C#更加灵活 。好在无论什么情况,他们之间都是可以互相移植的 。
对于事件定义,两种语言都是一个委派类型加一个事件属性,如:
[C#]
public delegate void MyEventHandler(Object sender,EventArgs e);
public event MyEventHandler MyEvent;
[Visual Basic]
Public Delegate Sub MyEventHandler(ByVal sender As Object,ByVal eAs EventArgs)
Public Event MyEvent As MyEventHandler
VB还支持另外一种更加紧凑的定义方法 , 只有一条语句:
Public Event MyEvent(ByVal sender As Object,ByVal eAs EventArgs)
移植的时候,要把参数部分分离出来,成为一个委派类型,再按照普通方法定义事件即可 。
关于事件响应,C#与Delphi等语言一样,是动态绑定事件过程的,其语法类似于下:
internal MyClass myobj;
...
myobj=new MyClass();
...
myobj.MyEvent+=this.myobj_MyEvent;
...
protected void myobj_MyEvent(Object sender,EventArgs e)
{
//语句
}
可以看到,C#是利用运算符连接事件过程和事件属性的 。之后,还可以用-=运算符解除事件过程与事件属性的绑定 。VB不支持运算符重载,但仍然支持这种动态绑定的事件过程,方法是使用AddHandler和RemoveHandler关键字 。如上面黑体部分可以移植为:
AddHandler myobj.MyEvent,AddressOf Me.myobj_MyEvent
解除绑定的语法与此类似 , 只是关键字为RemoveHandler而已 。一定不要忘记过程前面还有一个AddressOf关键字!
动态绑定的事件过程工作起来比较慢 , VB支持一种更快的静态绑定事件过程 。一旦为对象设置了静态的事件过程,就不能解除绑定,一般大多数情况都是如此 。语法如下:
‘定义变量时使用WithEvents关键字
Friend WithEvents myobj As MyClass
‘直接书写事件过程,注意Handles的语法:
Protected Sub myobj_MyEvent(ByVal sender As Object,ByVal eAs EventArgs)_
Handles myobj.MyEvent
‘语句
End Sub
它表示myobj_MyEvent这个过程仅仅响应myobj.MyEvent这个过程 。如果一个过程要响应很多个事件,把他们列在Handles后面,用逗号隔开,如Handles Event1,Event2,...
遇到这种情况,要看清Handles后面的所有对象和事件,将它们一一改写成动态绑定的语句:
Protected Sub XXX(...)Handles myobj1.MyEvent,myobj2.MyEvent
==
myobj1.MyEvent+=this.XXX;
myobj2.MyEvent+=this.XXX;
...
protected void XXX(...){}
当事件比较多时,C#显著变得比较麻烦,幸好一个过程响应一大堆事件的情况也不太多(不过我就编写过一个过程相应8个事件,移植起来好麻烦?。?。原则上说,将静态事件过程移植为动态事件过程并没有完全遵守移植的规定 , 但我估计他们实现的原理不会相差太多,所以也不用担心 。
6、异常处理 。VB支持两种形式的异常,即.net框架的异常和VB自己的错误号码 。而C#只支持第一种 。用到VB自己的错误号码的程序几乎无法移植到C#中,所以应该尽量使用.net框架的异常,如下面VB语句:

推荐阅读