++ 是 c#的用法
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務(wù)項目有:域名注冊、網(wǎng)站空間、營銷軟件、網(wǎng)站建設(shè)、碾子山網(wǎng)站維護(hù)、網(wǎng)站推廣。
vb.net vs c# 詳細(xì)的Operators運算符區(qū)別
vb.net
=====================
Comparison
= =
Arithmetic
+ - * /
Mod
\ (integer division)
^ (raise to a power)
Assignment
= += -= *= /= \= ^= = =
Bitwise
And Or Xor Not
Logical
AndAlso OrElse And Or Xor Not
Note: AndAlso and OrElse perform short-circuit logical evaluations
String Concatenation
c#
=====================
Comparison
== = !=
Arithmetic
+ - * /
% (mod)
/ (integer division if both operands are ints)
Math.Pow(x, y)
Assignment
= += -= *= /= %= = |= ^= = ++ --
Bitwise
| ^ ~
Logical
|| | ^ !
Note: and || perform short-circuit logical evaluations
String Concatenation
+
功能上的考慮 許多人認(rèn)為C#的功能比VB.net強大,或者C#更加適合.net等。其實這不是一兩句話能比較清楚的。C#的確有VB無法完成的功能,但VB也有C#無法完成的功能??偟膩碚f,對于.net開發(fā),VB和C#沒有任何差別,都100%兼容于CLS。下面列出的是他們語言功能上的不同,這些僅僅是語言實現(xiàn)上的問題,不會影響到生成的代碼。打*號的內(nèi)容與CLS不兼容。 C#有而VB沒有的功能: 1、 運算符重載。* 2、 不安全代碼(指針和固定內(nèi)存區(qū))。* 3、 無符號整數(shù)。* 4、 移位運算。 VB有而C#沒有的功能 1、 即時編譯。 2、 靜態(tài)事件綁定。 3、 條件異常捕獲。 4、 COM兼容類。* 5、 寬松的類型檢查和變量聲明。 6、 Visual Basic Runtime庫。 7、 可選參數(shù)、帶參數(shù)屬性、模塊等語言特征。* 8、 動態(tài)數(shù)組。*
都說在.NET里,.NET framework和CLR是應(yīng)用運行的基礎(chǔ)。那么VB.NET和C#是不是就完全一樣,只是語法不同嗎?
一、C#
--- 像VB一樣簡單,像C++一樣強大的新語
C#是第一流的面向組件的語言
由 Turbo Pascal, Delphi, and Visual J++的首席設(shè)計師Anders Hejlsberg 傾心3年設(shè)計
所有的語言元素都是真正的對象
開發(fā)強壯和可重用的軟件
所有的.NET Framework中的基類庫(Base Class Library)都由C# 編寫
二、VB.NET
--- 完全面向?qū)ο蟮腂ASIC語言
1.新語言特性
完全面向?qū)ο蟥C 繼承(Inheritance), 重載(overloading), 共享的成員, 結(jié)構(gòu)化異常處理
強壯的語言 – 嚴(yán)格的類型檢查, 變量聲明時初始化,支持垃圾收集(Garbage collection)
強大 – 支持委托(Delegates), free threading,Variant 數(shù)據(jù)類型被 Object 代替
2.與VB6一致的語法
三、2者的區(qū)別?
1.語法上的差異
例如循環(huán)的寫法
VB.NET
For I = 1 To 10
‘ for loop
Next I
C#
For (i=1;i11;i++) {
// for loop
}
另外Visual Basic 對大小寫不敏感,而C#是大小寫敏感的。
2.C# 具有但 Visual Basic 不具有的特性
指針, 移位操作符, 內(nèi)嵌的文檔(XML)
重載操作符
3.Visual Basic具有但 C# 不具有的特性
更豐富的語法: Events, Try…Catch, Select…Case, 實現(xiàn) Interface
后期綁定(Late binding), 動態(tài)數(shù)組, 模塊(modules), 可選參數(shù), 參數(shù)屬性(parameterized properties)
后臺編譯
C#與VB.net間移植的技巧
按理說,這兩種語言沒有什么移植的必要,因為他們生成的代碼可以完全通用。但是如果一個工程基本上是VB寫成的,卻需要少許已經(jīng)存在的C#過程,用組件并不是一種效率很高的辦法。就算是學(xué)習(xí)C#或VB,學(xué)會他們之間的移植可以雙倍的利用已經(jīng)存在的代碼(如好玩的Donkey.net就只有VB版)。
有人比較過這兩種語言,得出的結(jié)論是他們很相似。但即便是這樣,VB初學(xué)者看到諸如((Button)sender).Text=“啟動”;之類的語法不知道如何移植到VB,而C#初學(xué)者看到Handles Button1.Click等語法也會為移植而感到頭痛。下面就看看他們最難移植的部分:
1、Option語句。VB的Option語句可以打開或關(guān)閉變量聲明檢查和類型轉(zhuǎn)換檢查。尤其是Option Strict被關(guān)閉后,VB變成弱類型語言,很多類型轉(zhuǎn)換都是自動的,移植到C#中會產(chǎn)生無數(shù)錯誤。因此,如果要將帶有Option Strict Off語句的VB程序移植到C#,最好先在VB中將Option Strict打開,然后把所有類型轉(zhuǎn)換出錯的地方變成強類型轉(zhuǎn)換,然后再進(jìn)行移植。
2、類型轉(zhuǎn)換。VB提供了很多類型轉(zhuǎn)換函數(shù)型運算符,如CInt(),CSng(),CStr()等,在C#中只要用(int),(float),(String)即可。然而如果不是標(biāo)準(zhǔn)類型,如下面的C#語句:
((System.Button)sender).Text=“啟動”;
就要使用VB的函數(shù)型運算符CType來實現(xiàn)。上面的代碼正確的移植方法是:
CType(sender,System.Button).Text=“啟動”
千萬不要使用某些人推薦的,將Option Strict關(guān)閉,然后用后期綁定調(diào)用sender對象的方法,這根本不符合程序移植不能改變本質(zhì)的要求。
3、修飾符和屬性標(biāo)簽。VB和C#的修飾符是完全對等存在的,但是拼寫往往不同,給移植帶來了很多麻煩,尤其是表示相同意思的關(guān)鍵字從字面理解完全不同的時候。下面就給出了VB和C#對應(yīng)的關(guān)鍵字:
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
用別的方法實現(xiàn)
ByVal
無
ByRef
ref
Optional
無
ParamArray
params
無法實現(xiàn)
unsafe
無法實現(xiàn)
fixed
可以看出,VB的關(guān)鍵字比較長,而且使用上也比C#更加嚴(yán)格。從C#向VB移植的時候,要分外注意哪些VB有而C#沒有的關(guān)鍵字以及在C#拼寫相同,在VB中拼寫不同的關(guān)鍵字(如MustOverride和MustInherit)。有些關(guān)鍵字如unsafe,如果C#使用了他們,將無法移植到VB中。好在這些關(guān)鍵字在商業(yè)應(yīng)用中并不常用。
屬性標(biāo)簽在這兩種語言中非常的相似,移植上應(yīng)該沒有任何難度,只要知道在C#中用方括號[]表示屬性標(biāo)簽,而在VB中用的是尖括號。另外,如果要用名稱結(jié)合傳遞參數(shù),C#直接使用=號,而VB使用:=(冒號和等號)。
4、委派類型。委派類型就是安全的函數(shù)指針類型。在C#中,難以分辨是函數(shù)指針在工作還是函數(shù)本身在工作,因為他們的語法相同。當(dāng)要為一個委派類型的變量復(fù)制的時候,直接等于一個函數(shù)即可,如:
public delegate void FuncType(Object e)
...
FuncType func;
func=new FuncType(this.SampleFunction1);
//調(diào)用
func(something);
//換指向另外一個函數(shù)
func=this.SampleFunction2
然而VB中,委派類型就像是一般的對象,有它的方法,與函數(shù)本身明顯不同。你不能將過程的名字直接賦給一個委派類型的對象,而必須使用AddressOf運算符,下面的例子就是上文C#程序的VB版,注意那些實現(xiàn)不同的地方:
Public Delegate Sub FuncType(ByVal eAs Object)
...
Dim func As FuncType
func=New FuncType(AddressOf Me.SampleFunc1)
‘調(diào)用
func.Invoke(something)
‘換指向另外一個函數(shù)
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)
移植的時候,要把參數(shù)部分分離出來,成為一個委派類型,再按照普通方法定義事件即可。
關(guān)于事件響應(yīng),C#與Delphi等語言一樣,是動態(tài)綁定事件過程的,其語法類似于下:
internal MyClass myobj;
...
myobj=new MyClass();
...
myobj.MyEvent+=this.myobj_MyEvent;
...
protected void myobj_MyEvent(Object sender,EventArgs e)
{
//語句
}
可以看到,C#是利用運算符連接事件過程和事件屬性的。之后,還可以用-=運算符解除事件過程與事件屬性的綁定。VB不支持運算符重載,但仍然支持這種動態(tài)綁定的事件過程,方法是使用AddHandler和RemoveHandler關(guān)鍵字。如上面黑體部分可以移植為:
AddHandler myobj.MyEvent,AddressOf Me.myobj_MyEvent
解除綁定的語法與此類似,只是關(guān)鍵字為RemoveHandler而已。一定不要忘記過程前面還有一個AddressOf關(guān)鍵字!
動態(tài)綁定的事件過程工作起來比較慢,VB支持一種更快的靜態(tài)綁定事件過程。一旦為對象設(shè)置了靜態(tài)的事件過程,就不能解除綁定,一般大多數(shù)情況都是如此。語法如下:
‘定義變量時使用WithEvents關(guān)鍵字
Friend WithEvents myobj As MyClass
‘直接書寫事件過程,注意Handles的語法:
Protected Sub myobj_MyEvent(ByVal sender As Object,ByVal eAs EventArgs)_
Handles myobj.MyEvent
‘語句
End Sub
它表示myobj_MyEvent這個過程僅僅響應(yīng)myobj.MyEvent這個過程。如果一個過程要響應(yīng)很多個事件,把他們列在Handles后面,用逗號隔開,如Handles Event1,Event2,...
遇到這種情況,要看清Handles后面的所有對象和事件,將它們一一改寫成動態(tài)綁定的語句:
Protected Sub XXX(...)Handles myobj1.MyEvent,myobj2.MyEvent
==
myobj1.MyEvent+=this.XXX;
myobj2.MyEvent+=this.XXX;
...
protected void XXX(...){}
當(dāng)事件比較多時,C#顯著變得比較麻煩,幸好一個過程響應(yīng)一大堆事件的情況也不太多(不過我就編寫過一個過程相應(yīng)8個事件,移植起來好麻煩?。T瓌t上說,將靜態(tài)事件過程移植為動態(tài)事件過程并沒有完全遵守移植的規(guī)定,但我估計他們實現(xiàn)的原理不會相差太多,所以也不用擔(dān)心。
6、異常處理。VB支持兩種形式的異常,即.net框架的異常和VB自己的錯誤號碼。而C#只支持第一種。用到VB自己的錯誤號碼的程序幾乎無法移植到C#中,所以應(yīng)該盡量使用.net框架的異常,如下面VB語句:
Try
‘發(fā)生錯誤的代碼
Catch When Err.Number=52
‘解決錯誤的代碼
End Try
這段代碼無法直接移植到C#中,只有用Exception對象取代Err對象獲得異常信息,才能順利移植。另外VB的When語句帶給Try語句十分靈活的用法,必須用很高的技巧才能在C#中實現(xiàn),這就需要具體問題具體分析了。
VB支持Exit Try語句,可以直接從Try塊或Catch塊跳轉(zhuǎn)到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語句實現(xiàn)的錯誤處理,問題就麻煩了。代碼可能在過程中上下跳躍,無法預(yù)料語句的執(zhí)行方式。這種代碼理解起來就頭痛,更不要說移植了??傮w來說,把所有語句統(tǒng)統(tǒng)轉(zhuǎn)移到try塊中,然后用catch一一處理錯誤。遇到要返回(Resume語句)的時候,只好Copy代碼了。反正不是一件容易的事情,慢慢改就是了。
7、模塊。VB支持模塊,C#不支持。但也沒有關(guān)系,只要在C#中制造一個abstract類,共享所有成員,就和模塊一樣了。當(dāng)然不能像VB一樣直接訪問模塊中的成員,需要用到“類名.成員名”的用法。
8、接口。C#在接口方面也沒有VB強大(怎么這么重要的功能也不做得好一點?),VB采用Implements語句結(jié)合接口的成員和類的實現(xiàn)成員,而C#是用名稱結(jié)合。因此VB就可以隨便修改實現(xiàn)成員的訪問級別和名稱,而C#就不能改名稱。將C#移植為VB時,最好利用VB.net編輯器直接實現(xiàn)接口,比較簡單。把VB移植為C#時,就必須把改過的名字都改回來,遇到名字沖突就更討厭了(這時候我?guī)缀醪幌朐僖浦矠镃#了)。給一個例子:
[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不支持運算符重載,那么就必須用子程序和函數(shù)來模擬運算符。比如建立Plus和Minus方法模擬+和-的運算。當(dāng)然還是有很多情況(比如遇上了explicit和implicit語句)就真的沒有辦法了,只好不移植了。運算符重載是一個很不錯的功能,它能使很多操作簡單地完成,如果VB支持它,就真的是完美語言了。
同一個類中多次聲明相同名字的方法,每次聲明時都是不同的參數(shù)列表。方法重載主要是為了實現(xiàn)同一個功能,而使用統(tǒng)一的方法處理不同的數(shù)據(jù)類型。它是多樣性在同一類中的一種表現(xiàn)。而且方法重載時,可以使用不同的作用域關(guān)鍵字比如使用public、或者使用friend。
方法重載必須滿足以下三點:
1、方法重載時需要加入關(guān)鍵字OVERLOADS
2、方法的名稱必須相同。
3、方法的參數(shù)必須不同,這里的不同分三種情況:
a、參數(shù)個數(shù)不同,類型無限制;
b、參數(shù)個數(shù)相同,但是參數(shù)類型不同;
c、參數(shù)個數(shù)和類型都相同,但是參數(shù)的順序不同
指針類型不需要任何轉(zhuǎn)換,因為指針類型會自動值類型進(jìn)行運算符重載(在VB.NET中)Dim ip1 As IntPtr = 1Dim ip2 As New IntPtr(1)
我們都知道,面向?qū)ο笳Z言的三大特征是:封裝、繼承和多態(tài)。而重寫和重載是多態(tài)的兩種表現(xiàn)形式。多態(tài),顧名思義,就是指多種形態(tài)。而重寫和重載正好體現(xiàn)了這一點?,F(xiàn)在我們以 VB.NET 語言來說明兩者的區(qū)別。
重寫是發(fā)生在父類與子類之間的關(guān)系。具體來講就是子類可以重寫父類的現(xiàn)有的方法。它要求子類的方法名稱及參數(shù)必須與父類完全一致。比如吃飯,父親可以吃兩碗面,孩子同樣也是吃面,卻只能吃一碗。
重載則主要是發(fā)生在同一個類當(dāng)中的,它通過多個名稱相同的方法,但方法參數(shù)不相同,或者方法返回類型不相同來加以區(qū)別。其中,方法參數(shù)不相同包括以下幾種情況:參數(shù)的個數(shù)不相同,參數(shù)的類型不相同,參數(shù)的對應(yīng)位置不相同。需要說明的是,重載同樣可以應(yīng)用到父類與子類當(dāng)中。即子類重載了父類的方法。
重寫:
在 VB.NET 中,重寫汲及到的關(guān)鍵字有:
OverRidable: 在父類中聲明的可以在子類中重寫的方法。
OverRides: 在子類中聲明的要重寫父親中可重寫的方法。
MustOverRide: 在父類中,表示這個方法必須在子類中重寫。此時,該類必須聲明為抽象類。
NotOverridable: 如果當(dāng)前類還有子類,那么,在其子類中,該方法不允許被重寫。
重載:
在 VB.NET 中,重載用到的關(guān)鍵是 OverLoads。
這里需要說明幾點:
1. 對于在同一類當(dāng)中,一組名稱相同的方法或函數(shù)重載時,可以加關(guān)鍵字 OverLoads 或者不加。但如果其中有一個方法加上,那同組其它方法也必須加該關(guān)鍵字。
2. 如果該方法是重載父類中的方法。那么必須加 OverLoads 關(guān)鍵字。
3. 如果兩個同名函數(shù)僅返回類型不相同,則它們不能重載,即必須在參數(shù)上有所不同。