VB6?And?VB.NET
VB6 And VB.NET (2011-03-02 23:38:21)
總覽:
本文推薦給那些準備將自己的應用移植到Visual Basic.NET中的Visual Basic開發(fā)者。文章中包括 Visual Basic.NET升級工具的信息的介紹以及將Visual Basic 6結(jié)構(gòu)平滑升級到Visual Basic.NET 的指導 在打開Visual Basic 6.0工程時Visual Basic.NET會自動升級,但是在絕大多數(shù)情況下你需要對在Visual Basic.NET下打開的Visual Basic 6.0程序做一些改動。這篇文章的用途就是時你對原來的程序的改動盡可能的 少以及有效。 注:Visual Basic.NET仍然處于開發(fā)中,所以下面的一些細節(jié)可能還會有改動,下面的指導不保證在最終的產(chǎn)品出 來后代碼不需要改動。 什么是Visual Basic.NET? Visual Basic.NET是下一代的Visual Basic。而并不是簡單的在Visual Basic 6.0上在添加一些新特性而已, 微軟重新設計了產(chǎn)品以便使開發(fā)者能夠更加容易的開發(fā)分布式應用,例如基于WEB的程序以及多層系統(tǒng)。 Visual Basic.NET中有兩種窗體包,Windows窗體以及Web窗體;一個新版的ADO用于接受離線數(shù)據(jù)源;新的語 言,移走了原來的關鍵字,提高Type數(shù)據(jù)的安全性以及提供低級別結(jié)構(gòu)以滿足高級別開發(fā)者的需求。 這些新的特性為Visual Basic開發(fā)者提供了新的開發(fā)窗口:通過Web窗體以及ADO.NET,你可以快速開發(fā)可擴展 的Web站點;通過繼承,該語言實現(xiàn)了真正的支持面向?qū)ο缶幊蹋╫bject-oriented programming);Windows窗體 本身支持可視繼承;現(xiàn)在展開程序就象拷貝可執(zhí)行文件和控件到另一個目錄那樣簡單。 Visual Basic.NET現(xiàn)在完全集成在其它的Microsoft Visual Studio .NET語言中,不僅可以通過不同的語言 開發(fā)組件,而且通過交叉語言繼承,你可以從用一種語言編寫的類中派生用另一種語言編寫的類。 為什么Visual Basic.NET不提供100%的繼承性? 當在設計Visual Basic.NET時有兩個方向:翻新以及完全新建。為了體供給用戶盡可能多的新特性(例如繼 承以及線程),為了提供對新平臺的完全訪問,以及為了使Visual Basic能夠完全轉(zhuǎn)移到下一代的Web應用中。正 確的選擇是完全新建。 例如,很多在Windows窗體中的新特性可以通過在現(xiàn)有的代碼中添加新控件以及屬性來實現(xiàn)。但是這樣就會犧 牲新的Windows窗體的很多內(nèi)在特性,例如安全以及可視繼承性。 一個重要的目標是使Visual Basic代碼可以完全集成到用其它語言編寫的代碼中,例如Microsft C#(讀C Sharp) 或者Visual C++。以及讓Visual Basic開發(fā)者可以完全而且簡單利用.NET框架的功能,而不需要象原來那樣使用 Windows API調(diào)用。所有的Visual語言將與其它面向通用運行時語言(Common Language Runtime)的語言使用相同 的數(shù)據(jù)定義類型、數(shù)組、用戶自定義數(shù)組、類以及界面。不過這樣就要做一些犧牲,例如固定長度字符串以及以非 0數(shù)為下界的數(shù)組將不再被支持。 Visual Basic現(xiàn)在已經(jīng)成為一個真正面向?qū)ο笳Z言,一些不一致的特性,例如 GoSub/Return語句以及DefInt 已經(jīng)從新語言中移走了。 這樣的結(jié)果是使Visual Basic更加具有活力,使其成為一種開發(fā)基于Windows應用的最有效的工具之一,同時 也是開發(fā)下一代的Web站點的最佳工具。 升級到Visual Basic.NET Visual Basic.NET原則上可以使傳統(tǒng)的Windows開發(fā)者轉(zhuǎn)移到建立下一代Web以及多層應用中。所以,你的代碼 需要升級以適應Visual Basic.NET 在你使用Visual Basic.NET打開Visual Basic 6.0工程后,通過自動升級工具可以一步步的升級并建立一個新 的基于Visual Basic.NET的工程。這個升級是單向的,既新的Visual Basic.NET工程無法再在Visual Basic 6.0中 打開。 當工程升級后,Visual Basic.NET會修改語法的改變以及將Visual Basic 6.0窗體轉(zhuǎn)換為Windows窗體。在通 常情況下,你還需要手工做一些修改,因為自動升級工具不可能替你做所有的事情。 為幫助改變原來代碼,當你的工程升級以后,Visual Basic.NET會在工程中添加“升級報告”列出所有的問題, 同時在代碼中添加注釋提示你需要做的改動,這些注釋會以“TO DO”列表形式列出在任務列表窗口中,所以你可 以很容易的需要改變的部分,要想瀏覽相關的代碼只需要雙擊任務列表中的相關項就可以了。每一個任務以及升級 報告中的列表項都有相關的在線幫助標題以給你更多的幫助。 讓Visual Basic 6.0和Visual Basic.NET同時工作 Visual Basic.NET支持升級Visual Basic 6.0生成的工程,如果你的工程是在VB 1-5下編寫的,你需要首先升 級道Visual Basic 6.0工程,編譯、保存后再升級到Visual Basic.NET。 Visual Basic.NET和Visual Basic 6.0可以安裝在同一系統(tǒng)下并可以同時運行。同樣的,利用較早版本或者其 它語言編寫的COM組件也可以集成到Visual Basic.NET中。例如你可以拖-放一個Visual Basic 6.0編寫的ActiveX 控件到Visual Basic.NET的Windows窗體中,在Visual Basic.NET的類中使用Visual Basic 6.0的COM組件。 Visual Basic.NET編譯的組件同Visual Basic 6.0編譯的組件有一點點的不同,Visual Basic.NET對象是通過 垃圾收集方式釋放的,所以在對象被刪除到對象真正被從內(nèi)存中釋放之間或許會有一定的延遲。 另外,Visual Basic.NET提供了Visual Basic.NET組件同Visual Basic 6.0之間的二進制兼容性?,F(xiàn)在展開一 個組件變的比以往更加容易,配置一個組件文件只需要簡單的拷貝文件到目錄就可以了(不需要regsvr32)。將組 件升級到新版本之需要以新文件覆蓋就文件就可以了。你所要做的只是確定新組件的類同方法同舊組件兼容。 結(jié)構(gòu)介紹 .NET平臺提升了上一個版本平臺的結(jié)構(gòu),對于應用的可伸縮性和分布特性提供了更好的支持。例如離線數(shù)據(jù)訪 問、基于HTTP的消息傳遞文件配置。要獲得以上特性,你需要使用Visual Basic.NET。 基于瀏覽器的應用 Visual Basic 6.0和Visual Studio 6提供了以下的技術(shù)用于建立基于瀏覽器的Internet和Intranet應用: Webclasses DHTML projects ActiveX documents Active Server Pages (ASP) Visual Basic.NET中引入了ASP.NET,ASP.NET是增強版的ASP,并加入到了Web窗體(Web Forms)結(jié)構(gòu)中,Web 窗體是.NET架構(gòu)中非常重要的一個組成部分。一個Web窗體包含兩個部分:HTML文件和源程序文件。HTML文件用于 描述頁面;源程序文件用于響應、控制頁面事件。建立一個Web窗體同現(xiàn)在建立一個VisualBasic窗體一樣簡單。 它的WYSIWYG 界面設計方式同現(xiàn)在的Visual Basic是一樣的。下面的圖片演示了一個Web窗體的設計: Web窗體運行于服務器上,產(chǎn)生基于HTML3.2標準的HTML頁面發(fā)送到客戶端。這一點同ASP相同,但是由于Web程 序是編譯執(zhí)行的,同解釋執(zhí)行的ASP比較起來速度要快很多。 下面是對將Visual Basic 6.0開發(fā)的基于瀏覽器的應用無縫轉(zhuǎn)移到Visual Basic.NET上的一些介紹以及結(jié)構(gòu)方 面的建議。 我們建議你使用微軟多層構(gòu)架來開發(fā)你的應用,利用ASP來開發(fā)界面,同時使用Visual Basic 6.0或者Visual C++ 6.0開發(fā)的COM組件,Visual Basic.NET完全支持ASP,你可以同時使用ASP、ASP.NET、Web窗體來擴展你的應用。 同時Visual Basic 6.0或者VC6商用組件可以不經(jīng)升級獲修改直接在Visual Basic.NET中使用。 包含DHTML頁面以及客戶端DLL的DHTML 應用不能自動升級到Visual Basic.NET。我們建議你在Visual Basic 6.0下開發(fā)這些應用。同DHTML工程一樣,ActiveX Documents不被Visual Basic.NET支持。不能自動升級。我們建 議:或者在Visual Basic 6.0下開發(fā)ActiveX Documents或者將ActiveX Documents轉(zhuǎn)換為用戶自定義控件。不過 ActiveX documents 和 DHTML應用程序可以集成到Visual Basic.NET技術(shù)中。 Web類(Webclasses)在Visual Basic.NET中將不再存在。Web類應用將升級到ASP.NET;不過,在自動升級后 你還需要做一些更改?,F(xiàn)存的Web類應用可以集成到Visual Basic.NET的Web窗體和ASP應用中,但是在新工程中, 我們建議在新工程中使用ASP的Windows DNA平臺。關于更多的關于Windows DNA的信息,請訪問微軟DNA站點:http://msdn.microsoft.com/isapi/gomscom.as...sp?Target=/dna/ 客戶/服務器工程 Visual Basic 6.0提供以下技術(shù)用于建立客戶端/服務器應用: Visual Basic窗體 Microsoft Transaction Server (MTS)/COM+中間層對象 用戶控件 Visual Basic.NET提供了新的窗體包:Windows窗體。相對于Visual Basic 6.0的窗體,Windows窗體使用不同 的對象模塊,不過絕大部分是兼容的。當你的工程升級時,Visual Basic窗體自動升級到Windows窗體。下面是 Windows窗體的示例: 對于開發(fā)中間層的MTS and COM+ 服務器組件,Visual Basic.NET提供了更強大的支持。使用統(tǒng)一的調(diào)試器, 你可以從 客戶端到MTS/COM+組件再到客戶端進行步進調(diào)試。同時集成調(diào)試器也支持在MTS 和 COM+ 組件內(nèi)部進行 調(diào)試(組件需要以native code方式編譯,包含符號調(diào)試信息以及不進行優(yōu)化)。 Visual Basic.NET同樣也提供了新的中間層組件:Web Services(Web服務器)。Web服務器包含在ASP.NET中, 其結(jié)構(gòu)如下圖所示: 通過使用HTTP傳遞允許方法請求可以通過防火墻傳遞。數(shù)據(jù)的傳遞使用基于工業(yè)標準的XML,允許其它語言以 及平臺訪問它們的功能。盡管不再支持MTS事務,但是你還是有理由將你的應用升級到Web Server,如果你不僅需 要分布式事務處理而且需要跨平臺操作。通過Visual Basic.NET你可以通過簡單的拖-放操作來完成。 當你的工程升級后,用戶控件會升級到Windows控件;然而,自定義屬性標記設置以及加速鍵設定不會升級。 單層應用 Visual Basic 6.0支持建立以下類型的單層應用程序: 單層數(shù)據(jù)庫應用程序 Visual Basic插件 普通的應用程序以及游戲。 單層數(shù)據(jù)庫程序的代表就是使用Visual Basic訪問微軟Access數(shù)據(jù)庫。這些應用可以有限制的升級到Visual Basic.NET 現(xiàn)在Visual Basic.NET集成開發(fā)環(huán)境(IDE)已經(jīng)完全集成為Visual Studio.NET IDE的一部分,Visual Basic.NET 包含新的中性語言(language-neutral)的擴展模塊Visual Basic.NET的插件現(xiàn)在就等同于Visual Studio.NET add-ins,你可以利用Visual Studio.NET中的任何語言來開發(fā)插件。例如,你可以編寫一個Visual Basic.NET插件 來繪制Visual C#窗體的顏色或者為VB類添加注釋。為了支持這些新的功能,Visual Basic.NET已經(jīng)不再支持舊的 擴展模塊,你需要更改原來程序中的擴展對象。 很多程序被規(guī)于應用程序(Utility programs)。應用程序需要操作文件、設置注冊表。對此,Visual Basic.NET 也提供了新特性。例如意外句柄可以捕捉文件系統(tǒng)錯誤,使用注冊表類可以勇于操控注冊表。需要注意的是,一些 依賴于系統(tǒng)性能特征(performance characteristics)的程序,例如游戲需要做改進,因為Visual Basic.NET提 供了新的系統(tǒng)性能特征,對于Visual Basic.NET下的游戲開發(fā),你可以使用微軟DirectX7,或者使用新的GDI:GDI+, GDI+包含了很多新特性,對簡單的2-D游戲提供了Alpha混合、反鋸齒支持以及更多的圖像文件格式的支持。 數(shù)據(jù)庫操作 Visual Basic 6.0提供了以下類型的數(shù)據(jù)庫訪問方式: ActiveX Data Objects (ADO) Remote Data Objects (RDO) Data Access Objects (DAO) Visual Basic.NET包含了增強版的ADO,稱之為ADO.NET。ADO.NET的目標是操作離線數(shù)據(jù)。同時對于ADO的分布 應用提供了更強大的支持。ADO.NET提供了綁定數(shù)據(jù)庫到Windows窗體控件和Web窗體。 通過做一些小的更改,DAO,RDO,ADO仍然可以在Visual Basic.NET中使用。然而,Visual Basic.NET不支持DAO 和RDO數(shù)據(jù)庫到控件、數(shù)據(jù)庫控件或者RDO用戶連接的綁定。我們建議在應用中包含DAO和RDO的應用或者仍然使用 Visual Basic 6.0開發(fā)或者再升級到Visual Basic.NET前將它們更改為ADO數(shù)據(jù)綁定。 語言方面的改進 我們在很多的編程論壇或者新聞組中可以看到C++的擁護者將VB稱為一個玩具語言(Toy Language)。其中VB最 被人詬病的是它不真正支持面向?qū)ο缶幊?oop)。 在新的Visual Basic中,這些都將成為過去。Visual Basic.NET將真正支持oop。繼承(inheritance)、多態(tài) (polymorphism)以及重載(overloading)。當然還不止這些。包括一些新的數(shù)據(jù)結(jié)構(gòu)、結(jié)構(gòu)性的錯誤控制(Error Handing)以及線程。這些都將被新的VB所支持。 繼承 假設你編寫了一個只包含一個函數(shù)的名稱為BaseClass的基本類: Function GetCustomerName() ' Do some stuff End Function 如果你想建立一個新類,并使用BaseClass中的GetCustomerName函數(shù)。但有不想重寫一編代碼。那么通過繼承, 你可以這樣編寫新類: Inherits BaseClass Function GetCustomerID() ' Do some stuff End Function 重載 重載就是建立兩個具有同樣你名稱但是參數(shù)屬性不同的函數(shù)的過程。假設有GetCustomID函數(shù)根據(jù)輸入輸出用 戶的ID號碼。那么該函數(shù)可能有以下兩種類型: Function GetCustomerID(custname as string) As Integer ' 通過用戶名獲得用戶ID End Function Function GetCustomerID(purch as long) As Integer ' 根據(jù)購物單號碼獲得用戶ID End Function 通過重載,你就可以根據(jù)不同類型的輸入調(diào)用同一個函數(shù)。 實際上現(xiàn)在的VB在某種程度上提供了重載的功能,考慮下面的函數(shù): Function GetCustomID(vIN As Variant) As Long GetCustomID = vIN End Function 你可以以下面兩種方式調(diào)用 ID = GetCustomID("123") 或者 ID = GetCustomID(123) 那么為什么還要在新版本中引進重載呢?這是因為新的Visual Basic引進了新的特性:類型安全(default type safety)。在Visual Basic.NET中,Variant類型將不復存在,詳細的介紹看下面關于升級部分的內(nèi)容。 多態(tài) 多態(tài)是在一個類中重新定義一個函數(shù)的過程。例如你需要建立一個基于BaseClass類的子類,但是又需要重新 編寫GetCustomerName函數(shù),在新版的VB中,你就可以這樣寫: Inherits BaseClass Function GetOrders() Overrides Function GetOrders() ... End Function 線程 新的Visual Basic語言結(jié)構(gòu)部分將包含建立多線程,一個線程建立的范例如下: set t = New Thread(New Threadstart (AddressOf(BaseClass.Function1)) 從上面的范例還可以看到,Visual Basic.NET中的AddressOf函數(shù)將真正返回函數(shù)的指針。這在進行API調(diào)用, 例如回調(diào)函數(shù)方面將是很有幫助的。 錯誤處理(Error Handling) Visual Basic.NET的另外一個大的改進就是錯誤處理。Visual Basic將提供try…catch…finally結(jié)構(gòu),就象 Delphi中的那樣(微軟的原文是:just like those "respectable" languages :-))。例如: Sub SafeWrite() Try Open "Testfile" ... Write #1 Catch Kill "Testfile" Finally Close #1 End Try End Sub 升級 當代碼升級后,Visual Basic.NET會建立一個新的升級工程。下面通過幾個例子來說明你的代碼做了那些升級 Variant類型到Object類型 以前版本的Visual Basic支持Variant數(shù)據(jù)類型,該類型可以設定為除了固定程度字符串外的任何原始數(shù)據(jù)類 型和Empty,Error,Nothing和Null。在Visual Basic.NET中,Object數(shù)據(jù)類型可以設定為任何原始數(shù)據(jù)類型和Empty, Error,Nothing,Null和對象指針。當你的工程升級到Visual Basic.NET后,任何Variant定義都會改變?yōu)镺bject。 同樣,當你在編輯器中插入代碼時,Variant關鍵字也會被替換為Object。 Integer數(shù)據(jù)類型到Short數(shù)據(jù)類型 在Visual Basic 6.0中,16bit數(shù)現(xiàn)在稱為Short。32bit數(shù)稱為Integer(64bit數(shù)稱為Long)。當工程升級后, 數(shù)據(jù)定義會做如下改動: Dim x As Integer dim y as Long 更改為: Dim x As Short dim y as Integer 屬性語法 Visual Basic.NET對于自定義屬性的語法作樂更加直觀的更改,將Get和Set合而為一。例如原來的屬性如下: Property Get MyProperty() As Integer m_MyProperty = MyProperty End Property Property Let MyProperty(NewValue As Integer) m_MyProperty = NewValue End Property 升級后更改為: Property MyProperty() As Short Get m_MyProperty = MyProperty End Get Set m_MyProperty = Value End Set End Property VB窗體到Windows窗體 Visual Basic.NET包含新的窗體包,Windows窗體,Windows窗體包含內(nèi)含菜單編輯器。你的VB窗體會升級到 Windows窗體。 界面 在先前的版本中,公用類界面對于用戶總是隱藏的。在Visual Basic.NET中,公用類可以在代碼窗口中瀏覽和編輯。 升級報告及注釋 當工程升級后,升級報告會添加到你的工程中,詳細列出所有升級后的你所需要對代碼做的更改。同時代碼中 會加入注釋提示你注意任何潛在的問題。這些注釋自動出現(xiàn)在Visual Basic.NET的任務列表中。 編程介紹 使用先前綁定 Visual Basic 6.0和Visual Basic.NET都支持對象的延遲綁定,該方法事先定義一個變量為Object數(shù)據(jù)類型, 然后在運行時將其設定為一個類。然而,在升級過程中,當訪問延遲綁定對象的缺省屬性時可能會產(chǎn)生錯誤。例 如假設工程中包含F(xiàn)orm1,F(xiàn)orm1中有一個Label對象,名稱為Label1,下面的Visual Basic 6.0代碼將Label的標題 設定 為"SomeText" Dim o As Object Set o = Me.Label1 o.Caption = "SomeText" 在Visual Basic.NET的Windows窗體中,Label控件的Caption屬性被稱為Text屬性。當你的代碼升級后,所有 實例中的Caption屬性都會轉(zhuǎn)換為Text屬性,但是延遲綁定對象是無類型(type-less)的,VB無法檢測到對象的 類型并做更改,在這種情況下,你需要手工對代碼做改動。當你使用先前綁定對象時,對象可以自動升級,如下: Dim o As Label Set o = Me.Label1 o.Caption = "SomeText" 所以在程序中你需要將對象定義為適當?shù)膶ο箢愋投皇呛唵蔚亩x為Object對象類型。 同Visual C++類似。Visual Basic.NET支持函數(shù)的重載,例如下面的一個函數(shù)具有兩個形態(tài) Environ( Expression As Integer) As String Environ( Expression As String ) As String Visual Basic.NET會自動檢測該使用那個參數(shù)的函數(shù)。如果你傳遞一個正數(shù)值到Environ(),那么正數(shù)調(diào)用版 本會被調(diào)用;如果傳遞一個字符串,String版本會被調(diào)用。如果傳遞Object或者Variant數(shù)據(jù)類型到一個重載函數(shù) 將產(chǎn)生運行時錯誤。如果要想產(chǎn)生正確的結(jié)果就需要通過數(shù)據(jù)類型的強制轉(zhuǎn)換,例如: Dim a As String Dim v As Variant v = "Path" a = Environ(CStr(v)) '正確 對于延遲綁定的對象使用強制類型轉(zhuǎn)換是一個很好的編程習慣。這就使得代碼可讀性更好,同時也可以非常輕 松的移植到Visual Basic.NET使用Date存儲日期/時間較早版本的VB支持使用Double數(shù)據(jù)類型來存儲和改變時間。 在Visual Basic.NET中,這個特性將不再支持,因為在計算機內(nèi)部日期并不是以Double方式存儲的,例如下面的代 碼可以在Visual Basic 6.0中運行,但是在Visual Basic.NET中會產(chǎn)生錯誤。 Dim dbl As Double Dim dat As Date dat = Now dbl = dat '錯誤,不能將一個Date變量賦予一個Double變量 dbl = DateAdd("d", 1, dbl) '錯誤,Double變量不能用于日期函數(shù) dat = CDate(dbl) '錯誤 CDate函數(shù)不能將Double變量轉(zhuǎn)換到Date .NET架構(gòu)提供了ToOADate與FromOADate函數(shù)用于在double變量以及Date變量之間轉(zhuǎn)換。然而這需要在升級后手 工修改,所以在存儲日期時應該使用Date數(shù)據(jù)類型。 缺省屬性 在Visual Basic 6.0中,許多對象都有缺省屬性,缺省屬性在代碼中可以省略。例如: MsgBox Form1.Text1.Text 可以這樣編寫: MsgBox Form1.Text1 缺省屬性在代碼編譯是決定。同樣,你也可以在延遲綁定的對象中使用缺省屬性,例如: Dim obj As Object Set obj = Form1.Text1 MsgBox obj 對于延遲綁定的對象,缺省屬性在程序運行時決定。 Visual Basic.NET不支持缺省屬性,當你的工程升級后,Visual Basic.NET會自動決定缺省屬性,但是對于延 遲綁定的對象無法自動解決決定缺省屬性的問題。在這種情況下,你需要自己來修改代碼。更加復雜的是,很多庫 是通過 _Default屬性來實現(xiàn)缺省屬性的。_Default象是一個代理,它將調(diào)用傳遞給真正的缺省屬性。所以當你的 工程升級后,一些屬性會被更改為 _Default。代碼還是象往常那樣工作,只是代碼不如原來的實際屬性易讀。 Dim obj As Object Set obj = Me.Text1 MsgBox obj '不好的代碼,使用缺省屬性 MsgBox Me.Text1 '不好的代碼,使用缺省屬性 use: Dim obj As Object Set obj = Me.Text1 MsgBox obj.Text '好的代碼,寫出了屬性 MsgBox Me.Text1.Text '好的代碼,寫出了屬性 雖然缺省屬性不被Visual Basic.NET支持,但是帶參數(shù)的缺省屬性是被支持的,要了解它們之間的區(qū)別,下面 是范例: Dim rs As ADODB.Recordset rs("CompanyName") = "SomeCompany" rs!CompanyName = "SomeCompany" 實際上等于: Dim rs As ADODB.Recordset rs.Fields("CompanyName").Value = "SomeCompany" rs.Fields!CompanyName.Value = "SomeCompany" 因為Value是Fields的缺省屬性 對于第二種寫法,Visual Basic.NET是支持的;然而第一種情況不被支持,那么正確的用法如下: Dim rs As ADODB.Recordset rs("CompanyName").Value = "SomeCompany" rs!CompanyName.Value = "SomeCompany" 象上面的范例和其它的大多數(shù)情況可以在工程升級時解決,但是你還是要避免在Visual Basic 6.0中在Object 和Variant數(shù)據(jù)類型使用缺省屬性。因為升級程序無法發(fā)現(xiàn)并解決這些錯誤。 對Boolean類型數(shù)據(jù)使用AND/OR/NOT操作 And和Or關鍵字在Visual Basic.NET和Visual Basic 6.0中的使用是不同的,在Visual Basic 6.0中,AND運算 既執(zhí)行邏輯AND操作也執(zhí)行逐位AND操作,取決于操作數(shù)(如果是Boolean類型,執(zhí)行邏輯AND操作,如果是數(shù)字,執(zhí) 行逐位AND操作)。在Visual Basic.NET中,AND運算只執(zhí)行邏輯AND操作。對于逐位操作,在Visual Basic.NET提供 了一組操作:BitAnd, BitOr, BitNot以及BitXor 。 下面是演示這些差異的范例程序 Dim a As Integer Dim b As Integer Dim c As Boolean a = 1 b = 2 c = a And b MsgBox ("The answer is " & c) 當上面的代碼在Visual Basic 6.0下運行時,結(jié)果是False(執(zhí)行逐位AND操作);然而在Visual Basic.NET下, 結(jié)果是True(執(zhí)行邏輯AND操作)。 要確定你的程序在升級后也運行結(jié)果同升級前一樣,Visual Basic.NET包含了兼容函數(shù)VB6.And, VB6.Or以及 VB6.Not,這些函數(shù)執(zhí)行的結(jié)果同Visual Basic 6.0下的AND/OR/NOT操作的執(zhí)行結(jié)果是一樣的。當代碼升級后,結(jié) 果會象下面這樣: Dim a As Short Dim b As Short Dim c As Boolean a = 1 b = 2 c = VB6.And(a, b) MsgBox ("The answer is " & c) 升級后的代碼會得出False的結(jié)果,同Visual Basic 6.0下運行一樣 如果不想你的代碼升級后使用兼容函數(shù),就需要確保你的AND/OR/NOT都使用在Boolean類型數(shù)據(jù)的操作中,例 如,如果上面的代碼更改為下面的方式: Dim a As Integer Dim b As Integer Dim c As Boolean a = 1 b = 2 c = a <> 0 And b <> 0 MsgBox ("The answer is " & c) 當升級后,代碼同原來的幾乎一樣: Dim a As Short Dim b As Short Dim c As Boolean a = 1 b = 2 c = a <> 0 And b <> 0 MsgBox ("The answer is " & c) 同前面不同的是每一個操作都是在Boolean數(shù)據(jù)之間進行的,因此它們在Visual Basic 6.0中使用的都是邏輯 AND操作。所以在升級到Visual Basic.NET后不會發(fā)生改變。這樣做的意義是你可以直接在Visual Basic.NET和 Visual Basic 6.0之間拷貝和粘貼代碼,你的代碼會運行的更快因為使用的是本地的AND操作而不是兼容函數(shù)。 另外一個需要考慮的問題是對于函數(shù)結(jié)果的AND/OR/NOT 操作的問題,例如下面的范例: Dim b As Boolean b = Function1() And Function2() 在Visual Basic 6.0中,F(xiàn)unction1和Function2的結(jié)果都會執(zhí)行后再將結(jié)果進行AND操作。在Visual Basic.NET 中,只有當Function1的結(jié)果為True時才會計算Function2。因為Visual Basic.NET中的AND運算執(zhí)行的是邏輯AND操 作,如果Function1結(jié)果為False,AND結(jié)果肯定是False,為了加快速度就不再執(zhí)行Function2的了。但是如果 Function2另有目的,例如用于避免某些錯誤,那么就會出現(xiàn)不可預知的錯誤,那么上面的代碼升級后就會象下面 的樣子: Dim b As Boolean b = VB6.AND(Function1(), Function2()) 為了不在升級代碼中出現(xiàn)兼容函數(shù),原來的代碼需要做如下的改動: Dim b As Boolean Dim c As Boolean Dim d As Boolean c = Function1() d = Function2() b = c And d 另一個需要注意的是在Visual Basic.NET中,True值將不再是-1而是1。做這個改變是為了使Visual Basic.NET 能集成在 .NET語言中。因為有這個改變,你需要再你的Visual Basic 6.0工程中使用常量True而不是-1來表示真 值,使用Boolean類型而不是整數(shù)類型變量保存Boolean數(shù)據(jù)。下面的代碼說明了Visual Basic 6.0和Visual Basic.NET 之間的不同: Dim i As Integer i = True If i = -1 Then MsgBox ("True") Else MsgBox ("False") End If 在Visual Basic 6.0中,結(jié)果為True,而在Visual Basic.NET中結(jié)果為False。 如果對代碼做如下改動,程序在兩種語言下運行都會顯示True Dim i As Boolean i = True If i = True Then MsgBox ("True") Else MsgBox ("False") End If 通過上面的范例可以看出在程序中需要注意兩點: 1、使用常量True和False來判斷是否而不要使用0和-1 2、使用Boolean類型變量儲存Boolean數(shù)值而不要使用Integer類型變量 如果在你的程序中沒有這么做的話,在升級后你還需要做大量的手工改動 避免Null傳播(Propagation) 先前版本的VB支持Null傳播。Null傳播的前提是null值使用在表達式中,表達式的結(jié)果將是Null,例如下面 的范例,結(jié)果V都將是Null Dim V V = 1 + Null V = Null + Right$("SomeText", 1) V = Right("SomeText", 0) Null傳播在Visual Basic.NET中將不再被支持。象上面的語句1+Null會產(chǎn)生一個類型錯誤。另外在Visual Basic 6.0中有兩個求左值的函數(shù):Left和Left$前者返回值為Variant類型并且可以為空,Left$函數(shù)返回值為String 類型。在Visual Basic.NET中,只有一個Left函數(shù),該函數(shù)總是返回String類型值 為了使程序兼容Visual Basic 6.0以及Visual Basic.NET,你需要在代碼中加入對Null檢測的代碼,在Visual Basic.NET中,下面的函數(shù)將不再返回Null值: Chr Mid Command Oct CurDir Right Date RTrim Environ Space Error Str Hex Time LCase Trim LTrim UCase 由于數(shù)據(jù)庫中的數(shù)據(jù)可以包含Null值,所以你需要在程序中對獲得的數(shù)據(jù)加入代碼檢測其值是否為Null。 使用以0為下界的數(shù)組 Visual Basic 6.0允許你使用任何整數(shù)數(shù)字作為一個數(shù)組的上界和下界。同樣你也可以通過ReDim將一個Variant 重新定義為數(shù)組。為了能夠同.NET平臺下的其它語言協(xié)同工作,Visual Basic.NET數(shù)組必須以0作為下界,而且只 有一個變量事先定義為數(shù)組后才可以使用ReDim函數(shù)重新定義。雖然這樣限制了數(shù)組定義的靈活性,但是這樣可以 在Visual Basic.NET和.NET下的其它語言之間傳遞數(shù)組。下面的范例說明了新的定義數(shù)組的約束: Dim a(1 To 10) As Integer '錯誤:下界必須為0 Dim v ReDim v(10)