vb.net与c的区别 vbnet c#区别( 四 )


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#了) 。给一个例子:
[Visual Basic]
Public Class Class1:Implements IMyInterface
Public Sub DoSth()Implements IMyInterface.Method1
End Sub
End Class
[C#]
public class Class1:IMyInterface
{
public void Method1()
{
}
}
9、运算符重载 。这会遇到VB头痛了 , 既然VB不支持运算符重载,那么就必须用子程序和函数来模拟运算符 。比如建立Plus和Minus方法模拟+和-的运算 。当然还是有很多情况(比如遇上了explicit和implicit语句)就真的没有办法了,只好不移植了 。运算符重载是一个很不错的功能,它能使很多操作简单地完成,如果VB支持它,就真的是完美语言了 。

推荐阅读