关于c就是vb.net的信息( 六 )


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语句:
Try
‘发生错误的代码
Catch When Err.Number=52
‘解决错误的代码
End Try
这段代码无法直接移植到C#中,只有用Exception对象取代Err对象获得异常信息,才能顺利移植 。另外VB的When语句带给Try语句十分灵活的用法,必须用很高的技巧才能在C#中实现,这就需要具体问题具体分析了 。
VB支持Exit Try语句 , 可以直接从Try块或Catch块跳转到Finally块 。C#没有提供类似的语法 , 可以用以下技巧:
[Visual Basic]
Try
‘一些语句
Exit Try
Finally
‘一些语句
End Try
[C#]
try
{
//一些语句
goto__leave;
}
finally
{
//一些语句
}
__leave://别忘了这里还有哦!
总之是利用了finally块无法跳过的特征,用goto语句模拟了Exit Try语句 。
如果VB程序用的是VB特有的On Error GoTo语句实现的错误处理,问题就麻烦了 。代码可能在过程中上下跳跃,无法预料语句的执行方式 。这种代码理解起来就头痛,更不要说移植了 。总体来说,把所有语句统统转移到try块中,然后用catch一一处理错误 。遇到要返回(Resume语句)的时候,只好Copy代码了 。反正不是一件容易的事情,慢慢改就是了 。
7、模块 。VB支持模块,C#不支持 。但也没有关系,只要在C#中制造一个abstract类,共享所有成员,就和模块一样了 。当然不能像VB一样直接访问模块中的成员,需要用到“类名.成员名”的用法 。
8、接口 。C#在接口方面也没有VB强大(怎么这么重要的功能也不做得好一点?),VB采用Implements语句结合接口的成员和类的实现成员,而C#是用名称结合 。因此VB就可以随便修改实现成员的访问级别和名称,而C#就不能改名称 。将C#移植为VB时,最好利用VB.net编辑器直接实现接口,比较简单 。把VB移植为C#时,就必须把改过的名字都改回来,遇到名字冲突就更讨厌了(这时候我几乎不想再移植为C#了) 。给一个例子:

推荐阅读