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语句:
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代码了 。反正不是一件容易的事情,慢慢改就是了 。
推荐阅读
- 主播直播要求,主播直播要求怎么写
- 包含redis定时原理的词条
- 为什么视频会有彩蛋出现,为什么视频会有波纹
- 萤石云视频用什么网络,萤石云视频用什么网络都显示网络异常
- mysql怎么创造表 mysql创建表教程
- redisgeo的使用,redisgem
- 在视频号上怎么建小号,视频号如何创建
- python求函数长度 python求长度的函数
- go语言精髓教学视频,go语言从入门到进阶实战