全局層
VB支持Module,是一種全部成員都是靜態的特殊類型
C#支持static class,和VB的Module類似;
VB的Imports語句可以把類的靜態成員導入,而C#的using語句沒有這個功能
Imports System.Math
VB可以選擇變量是否必須聲明,以及類型是否必須指定(通過Option語句)
C#則默認是VB最嚴格的狀態
C#可以使用extern alias指定程序集的別名,並使用別名限定運算符::來解析類名沖突的兩個程序集
VB沒有這個功能,但可以用Global關鍵字獲得命名空間級別名稱沖突解析能力
C#可以指定友元程序集,VB不支持
//成員層
VB可以直接重寫Object.Finalize方法,而C#必須采用析構函數的語法
C#可以指定attribute的target以便清楚地放置attribute,而VB則通過尖括號的位置來決定,有時候寫不出某種C#可行的語法
VB能夠重載這些C#不支持的運算符:&, ^, Like, \
C#能夠重載這些VB不支持的運算符:++, --, !
VB中子類的構造函數,先調用父類的構造函數,然後才初始化子類的字段
C#中子類的構造函數,先初始化子類的字段,然後才調用父類的構造函數
VB的Implemnts語句可以為實現接口的方法改名,改變訪問級別
C#不支持但是有一個顯式實現的語法可以幫忙
VB的函數重載,子類和父類的方法視為同級
C#的函數重載,子類優先於父類
VB的Main函數自動加,可以改
//繼續成員層
C#的自定義event可以修改add和remove的規則
VB的自定義Event除了C#的之外,還支持重載RaiseEvent語句的用法
VB的Event可以直接書寫Event參數,自動生成Delege類型
C#的event必須指定delegate類型
VB支持WithEvents/Handles靜態事件綁定語法,也支持AddHandler動態綁定方法
C#的事件只支持使用+=動態綁定
VB的屬性(Property)可以帶參數
C#的屬性不能帶參數
盡管不支持手工定義,VB支持屬性按引用傳遞值,C#不支持
VB可以指定一個帶有參數的屬性為Default,於是支持索引語法
C#則必須把這個東西聲明為索引器,即this語法
VB允許方法帶有若干可選參數(Optional)可指定默認值
C#不允許
C#支持out參數,傳入前不需要初始化
VB不內置支持
C#支持類中使用fixed buffer,即固定大小的類似數組的成員
VB不支持
C#支持按照參數是否帶有ref/out進行函數重載
VB不支持這種重載
C#允許僅大小寫區分的兩個函數或變量存在
VB不區分大小寫,因此也不允許
//函數層
VB支持局部Static變量
C#不支持
VB支持數組的最後一唯大小可變
C#的數組大小不能改變
VB的Try Catch語句支持Exit Try直接進入Finally
C#無類似語句
VB的Catch可以帶When子句,使用.NET的異常filter功能有選擇的進行捕獲
C#完全不支持這一功能
VB可以使用傳統的On Error方法,非結構化地處理異常
C#僅支持結構化
C#支持使用checked語句暫時打開或關閉整數溢出檢查
VB僅支持整個項目級別處理
VB支持使用函數名作為返回變量,也支持Return
C#只支持Return
VB的Try, Using, For, For Each等語句支持使用前邊定義的變量
C#的對應語句只能在語句開始處定義
C#可以支持unsafe語法有限地支持指針和stack數據的訪問
VB不支持
C#支持yield return語法的迭代器生成
VB不支持
C#支持delegate語句就地生成支持closure的匿名方法
VB不支持
C#支持在委托與方法結合的過程中使用協變和反邊規則
VB則只能使用完全匹配規則
VB和C#的循環和分支有若干次要差別
C#支持nullable類型的運算符跨類型支持
VB需要手工完成同樣功能
VB支持用實例訪問類的靜態成員
C#只支持類明訪問
VB支持按照非虛函數的規則,調用自身類型定義的一個虛函數
C#不支持這一功能
類庫層
VB有一個非常好用Microsoft.VisualBasic.dll,實現了許多幫助函數,Application Framework應用程序框架,My命名空間等
C#只能望眼欲穿了……
C#以out/ref或者大小寫區分不同函數,這就是不符合CLS的。
VB的每個特性幾乎都是CLS兼容的(即使是那些C#不支持的),在VB中使用不會從根本上影響到與C#的交互