C#與VB.net有什麼不同?

來源:互聯網
上載者:User
都說在.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<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.net間移植的技巧

按理說,這兩種語言沒有什麼移植的必要,因為他們產生的程式碼可以完全通用。但是如果一個工程基本上是VB寫成的,卻需要少許已經存在的C#過程,用組件並不是一種效率很高的辦法。就算是學習C#或VB,學會他們之間的移植可以雙倍的利用已經存在的代碼(如好玩的Donkey.net就只有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),(float),(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 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支援它,就真的是完美語言了。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.