C#与VB.net有什么不同呀?
都说在。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。新语言特性...全部
都说在。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 = 1 To 10 ‘ for loop Next I C# For (i=1;i。
另外,如果要用名称结合传递参数,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 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语句: 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支持它,就真的是完美语言了。收起