C#与VB有什么不同?
都说在.NET⾥,.NET framework和CLR是应⽤运⾏的基础。那么VB.NET和C#是不是就完全⼀样,只是语法不同吗?
⼀、C#
— 像VB⼀样简单,像C++⼀样强⼤的新语
C#是第⼀流的⾯向组件的语⾔
由 Turbo Pascal, Delphi, and Visual J++的⾸席设计师Anders Hejlsberg 倾⼼3年设计
所有的语⾔元素都是真正的对象
开发强壮和可重⽤的软件
所有的.NET Framework中的基类库(Base Class Library)都由C# 编写
⼆、VB.NET
— 完全⾯向对象的BASIC语⾔
1.新语⾔特性
完全⾯向对象– 继承(Inheritance), 重载(overloading), 共享的成员, 结构化异常处理
强壮的语⾔ – 严格的类型检查, 变量声明时初始化,⽀持垃圾收集(Garbage collection)
强⼤ – ⽀持委托(Delegates), free threading,Variant 数据类型被 Object 代替
2.与VB6⼀致的语法
三、2者的区别?
1.语法上的差异
例如循环的写法
VB.NET
For I =1To10
‘ for loop
Next I
C#
For (i=1;i<11;i++){
// for loop
}
另外Visual Basic 对⼤⼩写不敏感,⽽C#是⼤⼩写敏感的。
2.C# 具有但 Visual Basic 不具有的特性
指针, 移位操作符, 内嵌的⽂档(XML)
重载操作符
3.Visual Basic具有但 C# 不具有的特性
更丰富的语法: Events, Try…Catch, Select…Case, 实现 Interface
后期绑定(Late binding), 动态数组, 模块(modules), 可选参数, 参数属性(parameterized properties)
后台编译
C#与VB间移植的技巧
按理说,这两种语⾔没有什么移植的必要,因为他们⽣成的代码可以完全通⽤。但是如果⼀个⼯程基本上是VB写成的,却需要少许已经存在的C#过程,⽤组件并不是⼀种效率很⾼的办法。就算是学习C#或VB,学会他们之间的移植可以双倍的利⽤已经存在的代码(如好玩的Donkey就只有VB版)。
有⼈⽐较过这两种语⾔,得出的结论是他们很相似。但即便是这样,VB初学者看到诸如((Button)sender).Text=“启动”;之类的语法不知道如何移植到VB,⽽C#初学者看到Handles Button1.Click等语法也会为移植⽽感到头痛。下⾯就看看他们最难移植的部分:
1、Option语句。VB的Option语句可以打开或关闭变量声明检查和类型转换检查。尤其是Option Strict被关闭后,VB变成弱类型语⾔,很多类型转换都是⾃动的,移植到C#中会产⽣⽆数错误。因此,如果要将带有Option Strict Off语句的VB程序移植到C#,最好先在VB中将Option Strict打开,然后把所有类型转换出错的地⽅变成强类型转换,然后再进⾏移植。
2、类型转换。VB提供了很多类型转换函数型运算符,如CInt(),CSng(),CStr()等,在C#中只要⽤(int),(flo
at),(String)即可。然⽽如果不是标准类型,如下⾯的C#语句:
((System.Button)sender).Text=“启动”;
就要使⽤VB的函数型运算符CType来实现。上⾯的代码正确的移植⽅法是:
CType(sender,System.Button).Text=“启动”
千万不要使⽤某些⼈推荐的,将Option Strict关闭,然后⽤后期绑定调⽤sender对象的⽅法,这根本不符合程序移植不能改变本质的要求。
3、修饰符和属性标签。VB和C#的修饰符是完全对等存在的,但是拼写往往不同,给移植带来了很多⿇烦,尤其是表⽰相同意思的关键字从字⾯理解完全不同的时候。下⾯就给出了VB和C#对应的关键字:
VB
C#
VB
C#
Inherits
:
Implements
:
MustInherit
abstract
NotInheritable
sealed
Overridable
virtual
NotOverridable
sealed
MustOverride
abstract
Overrides
override
[Overloads]
Shadows
new
Shared
static
Public
public
Protected
protected
Friend
internal
Protected Friend
protected internal
Private
private
Static
⽤别的⽅法实现
ByVal
ByRef
ref
Optional
ParamArray
params
⽆法实现
unsafe
⽆法实现
fixed
可以看出,VB的关键字⽐较长,⽽且使⽤上也⽐C#更加严格。从C#向VB移植的时候,要分外注意哪些VB有⽽C#没有的关键字以及在C#拼写相同,在VB中拼写不同的关键字(如MustOverride和MustInherit)。有些关键字如unsafe,如果C#使⽤了他们,将⽆法移植到VB 中。好在这些关键字在商业应⽤中并不常⽤。
属性标签在这两种语⾔中⾮常的相似,移植上应该没有任何难度,只要知道在C#中⽤⽅括号[]表⽰属性标签,⽽在VB中⽤的是尖括号<>。另外,如果要⽤名称结合传递参数,C#直接使⽤=号,⽽VB使⽤:=(冒号和等号)。
4、委派类型。委派类型就是安全的函数指针类型。在C#中,难以分辨是函数指针在⼯作还是函数本⾝在⼯作,因为他们的语法相同。当要为⼀个委派类型的变量复制的时候,直接等于⼀个函数即可,如:
public delegate void FuncType(Object e)
...
FuncType func;
func=new FuncType(this.SampleFunction1);
//调⽤
func(something);
//换指向另外⼀个函数
func=this.SampleFunction2
然⽽VB中,委派类型就像是⼀般的对象,有它的⽅法,与函数本⾝明显不同。你不能将过程的名字直接赋给⼀个委派类型的对象,⽽必须使⽤AddressOf运算符,下⾯的例⼦就是上⽂C#程序的VB版,注意那些实现不同的地⽅:
Public Delegate Sub FuncType(ByVal eAs Object)
...
Dim func As FuncTypebasic语言是什么软件
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+=bj_MyEvent;
...
protected void myobj_MyEvent(Object sender,EventArgs e)
{
//语句
}
可以看到,C#是利⽤运算符连接事件过程和事件属性的。之后,还可以⽤-=运算符解除事件过程与事件属性的绑定。VB不⽀持运算符重载,但仍然⽀持这种动态绑定的事件过程,⽅法是使⽤AddHandler和RemoveHandler关键字。如上⾯⿊体部分可以移植为:
AddHandler myobj.MyEvent,bj_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⽀持两种形式的异常,即框架的异常和VB⾃⼰的错误号码。⽽C#只⽀持第⼀种。⽤到VB⾃⼰的错误号码的程序⼏乎⽆法移植到C#中,所以应该尽量使⽤框架的异常,如下⾯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
‘⼀些语句