<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    飛艷小屋

    程序--人生--哲學___________________歡迎艷兒的加入

    BlogJava 首頁 新隨筆 聯系 聚合 管理
      52 Posts :: 175 Stories :: 107 Comments :: 0 Trackbacks

    都說在.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 e As 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 e As EventArgs)
    ??
    ? Public Event MyEvent As MyEventHandler
    ??
    ? VB還支持另外一種更加緊湊的定義方法,只有一條語句:
    ??
    ? Public Event MyEvent(ByVal sender As Object, ByVal e As 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 e As 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支持它,就真的是完美語言了。
    ??
    ? 好了,想必最麻煩的地方已經說完了,剩下的就是簡單的Copy了。雖然有些地方還沒有說清楚,但基本上闡明了兩種語言的不同(一看,不同還挺多的吧),反正也不用移植大的工程,了解這些內容主要是為了利用雙倍的利用已經存在的代碼,但愿本文對你有用。

    posted on 2006-06-06 15:17 天外飛仙 閱讀(523) 評論(0)  編輯  收藏 所屬分類: .net
    主站蜘蛛池模板: 久久久久高潮毛片免费全部播放| 亚洲日韩一区二区三区| 一级毛片免费视频网站| 美女黄网站人色视频免费国产| 亚洲免费视频网址| 亚洲视频免费一区| 亚洲国产美女精品久久久久| 在线观看免费视频资源| 日木av无码专区亚洲av毛片| 最近中文字幕国语免费完整| 亚洲精品成人久久| 1a级毛片免费观看| 亚洲一级毛片免费看| 精品久久久久久久久免费影院| 精品久久久久久亚洲精品| 成年男女男精品免费视频网站| 亚洲精品第一国产综合亚AV| 免费永久看黄在线观看app| 特黄特色大片免费| 亚洲综合区小说区激情区| 国产线视频精品免费观看视频| 久久精品国产亚洲av成人| 最好看的中文字幕2019免费| 亚洲综合激情五月丁香六月| 国产免费观看a大片的网站| av电影在线免费看| 亚洲av无码av制服另类专区| 国产成人福利免费视频| 亚洲AV无码AV日韩AV网站| 亚洲免费一区二区| 免费视频成人片在线观看| 亚洲人成小说网站色| 亚洲第一永久AV网站久久精品男人的天堂AV | 亚洲色精品88色婷婷七月丁香| 国产一级淫片a免费播放口| 久久精品国产亚洲AV高清热| 成人毛片18女人毛片免费96| 成人国产网站v片免费观看| 亚洲成在人天堂在线| 在线观看免费污视频| 国产精品成人69XXX免费视频|