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