VB.NET的重大轉變
緒論
本文討論一下VB.NET中的一些重大轉變,看一看在下一個版本的Visual Basic中,你的代碼將變成什么樣子。好,現在系緊安全帶,打起精神投入到又一次VB.NET的旋風之旅吧...
Windows 表單
從本質上來說,Windows表單比我們今天所了解的表單有了很大的改進。它們捆綁了一些相當酷的功能,這些功能使你能夠建立相當高級的屏幕效果。
好,現在開始探索Windows 表單 ...
1、啟動VB.NET
2、在開始頁面上點擊"創建新的工程文件"
3、在"Visual Basic工程文件"下,選擇"Windows應用程序"
4、如果需要,就修改名字和位置
5、點擊 OK按鈕
好,現在你看到了一個Windows表單!
現在看看方案瀏覽器。請看看Form1.vb文件中的表單文名是怎么稱呼的?所有的Visual Basic代碼,不管我們說的是表單還是類模塊,都存儲為.vb文件。文件內的代碼描述了它是什么以及它做什么。
點擊Form1 ,快速瀏覽一下屬性窗口:

這里與VB6.0相比有一些變化,標題屬性現在叫做文本,字體屬性被分成名稱和字號等,還有一個IsMDIContainer 屬性用于建立MDI應用程序。
注意:.Caption屬性在VB.NET中消失了,它們都被標準化為.Text,并且.Tag屬性也消失了。
現在看看左側的工具箱。點擊"Win Forms"框,你會驚奇地看到可以在VB.NET中使用的所有新的控件種類。
使用向下箭頭將列表滾動到工具箱底部,你會發現比以前更具"本色"的控件。現在我們就來看其中幾個。
向 Form1增加一個標簽,這同VB6中的操作一樣。
嘗試改變字體和以前的標題屬性,這也沒有主要的改變。
VB.NET捆綁了常用的控件:Button(按鈕)(對應以前的CommandButton), RadioButton(復選按鈕) (對應以前的OptionButton) 、GroupBox (對應以前的Frame)。當然還有 TextBox(文本框)、 CheckBox(單選框)、 PictureBox(圖形框)、 ListBox(列表框) 和ComboBox(組合框)。
試一試向表單中增加以上各個控件,并設置它們的核心屬性。
注意:你會注意到Shape控件沒有了。但是你還是可以向表單中增加圖形的,這將使用到System.Drawing.Graphics 名稱空間,也就是"用代碼畫圖"。
在這個列表中,你還能發現一些在Visual Basic 6 工具箱中不常發現的熱門控件。例如: DateTimePicker、ProgressBar 和ListView 控件。這以前,你不得不用組件菜單把這些控件帶進應用程序中。
要想知道控件在運行時間看起來是什么樣的,按 F5鍵進行編譯并啟動應用程序,這與VB6一樣。
新控件
除了這些之外,你還會發現一些從沒見過的控件。下面我們看一下其中最重要的幾個。
MainMenu控件
首先是MainMenu(主菜單)控件,其實這就是以前的Menu Builder(菜單建立器)。讓我們用用它:
l 向表單中增加 MainMenu控件
2 在表單中,點擊方框,顯示以下內容:在這里鍵入
3 鍵入:&File(文件)
4 現在向新的文件菜單中增加一些子項
5 在"在這里鍵入"框中點擊,將其擴大到"File"右側,增加一些菜單
6 按F5,運行應用程序,測試新菜單
注意:向菜單中增加一個間隔時,可以鍵入一個單破折號。

現在可以同VB6中一樣,向這些菜單項中增加代碼。
LinkLabel控件
這是一個控件設計,看起來象是一個Web頁面的超級鏈接。默認狀態下它是帶有下劃線的蘭色,當鼠標經過它時會變成手的形狀,并且當它被點擊后會改變顏色。但是在默認狀態下它并不是被鏈接到一個Web站點,當點擊它時,Click事件下的代碼就會運行。
向表單中增加一個LinkLabel 控件,按 F5 運行并測試新的LinkLabel。
注意:試著找出LinkBehavior屬性以獲得 LinkLabel的更多效果。
其他控件
ErrorProvider是一個格外酷的控件。如果發生了一個確認錯誤,它就會自動用一個圖標來突出控件。這里是一個使用范例:

另外,ToolTips(工具提示)在VB.NET中的處理也不同,VB.NET中增加了ToolTip(工具提示)控件。還有,那些Windows 打開和保存的對話框現在是作為"內置"控件使用的。
TrayIcon控件使得向系統盤增加自定義圖標和菜單簡單化。HelpProvider 控件使你很容易地進行幫助文件的訪問。
現在我們開始研究幾個新的很棒的表單特性...
Dock的樂趣
也許我不應該把整整一頁都用在這些叫做"Anchor"(錨)或"Dock"(塢)的東西上。但是不管怎么說,我們都曾經被困在調整大小的地獄中。我曾經親自在VB-World中寫過一些代碼,幫助自動修復這些問題,但是結果有可能變得出人預料地混亂。
這就是為什么大多數VB.NET控件都包含著Anchor和Dock屬性,它們將幫助你解決那些棘手的調整大小的情況。
首先看看Anchor屬性,它可以強制控件的一個或多個邊沿與表單的邊沿保持一個固定的距離。
下面創建一個應用程序。想象一下你正在創建一個Web應用程序,在表單底部想要一個文本框。你想要它保留在那里,隨著表單大小而伸縮。
然后,向表單中增加一個文本框。看起來是這樣的:

最后,點擊TextBox1,查看它的 Anchor屬性(在 Layout(布局)下面)。默認狀態下,"anchors"都是在左上角。也就是說,它與表單的上面和左邊的邊沿保持一個固定的距離:

現在我們來修改一下:
首先,修改 Anchor屬性,不選Top(頂部),而選 Left(左)、 Right(右)和Bottom(底部)。屬性文本應該修改為 'BottomLeftRight'。這就是說控件將在底部、左側和右側與表單保持固定距離。
然后,按F5運行你的應用程序。
最后,調整表單大小,享受一下你的成果。
Dock也相當重要,它與VB6中某些控件的Align屬性相似。它強制特定控件固定在表單的一側,或者是用"Fill"選項來覆蓋整個表單。
l 向Form1增加一個新的文本框
2 實驗一下Dock屬性
Visual的遺產
在VB.NET中,你也可以得到遺產。但是不是現金,而是一些代碼和組合框之類的東西。
現在我們看看視覺遺產。這就是從另一個"主人"表單那里"繼承"其布局的的表單,也許還包括代碼。
假設在多個表單中有一套公共的特征。也許是一個 'OK' 按鈕,一個Web超級鏈接,一個表單背景,數據輸入文本框控件,或者是向導的布局,隨便使用的是什么公共表單元素都可以,你都可以用視覺遺產來共享它們以及相關邏輯。
首先創建一個新的Windows應用程序,然后向表單Form1中增加一些公共元素。
公共元素包括:一個LinkLabel(鏈接標簽),它的"anchors"固定為BottomRight;一個OK 按鈕,其anchors為 BottomLeft;還有一個帶有應用程序名的簡單標簽。整體看起來就象這樣:

現在,在你可以繼承一個表單之前,它必須被"建立"(也就是某種小型編譯處理)。下面開始:
l 在建立菜單中選擇建立
然后,繼承那個表單:
2 點擊工程文件,增加被繼承的表單
3 確認"被繼承的表單"被選中,然后點擊OK
3 在出現的列表中,選擇Form1并點擊OK

如果Form2沒有自動出現,就在方案瀏覽器中雙擊它。好,現在看看,Form2具有了Form1的所有特性。
接著向Form2中增加一些文本框控件:

現在看看運行中的Form2。要這樣做,我們必須修改工程文件的屬性:
l 在方案瀏覽器的Windows應用程序上點擊右鍵,
2 在彈出菜單中選擇屬性
屏幕應該是下面這樣的:

如果不是的話,那就是在方案瀏覽器中選擇了錯誤的項目:
現在快速瀏覽一下。在這里你可以修改匯編名(改成我們給工程文件用的名稱)、版本號、應用程序圖標以及Startup(啟動)對象。
試一試將Startup對象改成Form2 并點擊 OK,并按F5來測試應用程序,也就是測試繼承來的表單。
注意到它是如何工作的嗎?現在試著調整Form2的大小。如果在被繼承的控件上已經使用了Anchor屬性,那么它們就會跟著新表單一起移動。
如果你在Form1上放入了代碼,那么也會自動被繼承。實際上,你甚至可以允許Form2覆蓋功能的某些部分。例如,"OK"按鈕后面的代碼可以由Form2來決定,盡管其外型是從Form1中來的。
編碼
毫無疑問,VB.NET對編碼帶來了很大的變化。
每次我寫文章詳細介紹這些不同,都會收到憎恨的郵件和持續的ICQ 麻煩。實際上,我還在為以下問題思考一個聰明的答案: "你到底為什么要去掉Shape控件?"
所以我打算從一開始就承認,并不是每個人都贊成這種變化。這是個很大的變化!當然,沒人喜歡變化。但是,一旦你真正開始理解為什么會有這些變化以及如何適當地使用它們,所有這些才突然變得有意義了。
無論如何,讓我們描畫出來,進入代碼窗口看看:
l 創建一個新的Windows應用程序
2 向Form1上放一個新的按鈕
3 在Form1 上點擊右鍵
4 選擇"查看代碼"

現在你可能已經在撓頭了。如果還沒有的話,那你總是要撓的。現在我已經非常迷惑了。
所有這些代碼都是從哪來的?答案真是奇怪,這些代碼是你做的。這都是在你增加一個新的Windows 表單時創建的。還有,它是做什么的呢?這個代碼的核心只是描述了你的表單。
還記得前面說過VB.NET中的所有文件擴展名都是.vb嗎?VB.NET之所以知道它是一個表單,是因為屏幕后面的這些代碼告訴了它。代碼對表單的名稱直到它的維度都進行了描述。
你會注意到Form1實際上是一個類。從VB4開始,我們就能夠將表單作為類來對待。但是事實上,它們從來就不真正是類。而有了VB.NET,它們成為了類,而且帶來了在VB.NET類中所能找到的常用資源,包括構造器和處理方法。
注意:通過在代碼窗口的左側使用"plus"和"minus"標記,可以擴展或隱藏大塊的代碼。另外還可以用 #Region 語句來定義自己的"hideable"(可隱藏)區域。
編寫自己的代碼
現在來編寫一個我們自己的VB.NET代碼。首先要切換回Design(設計)視圖。
l 點擊視圖,Designer
你會看到在VB.NET中編寫一個按鈕的代碼同在VB6中同樣容易。
2 雙擊 Button1
現在光標應該停留在代碼窗口的以下內容處:
Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs)
End Sub
當Command1被點擊時,這兩行之間的代碼就會被啟動。
要響應按鈕事件或表單中的其它事件,可以通過代碼窗口上面的組合框來選擇類和方法的名稱。而且,在響應一個事件時還可以激活一個單獨的子程序。
現在我們來增加一些代碼。向Button1的Click事件中增加以下代碼:
MessageBox.Show("Hey... hehe... you clicked me and it tickles!")
然后按F5并進行測試。
在第一部分我們已經提到,MessageBox.Show 是一個新的VB.NET 方法,用來顯示一個信息框,它代替了舊的 MsgBox語句。
名稱空間
VB.NET中的"名稱空間"是一種對功能進行組織的很棒方法,其實它們就是建立在整個.NET 框架上的一批類,每種.NET編程語言都要使用這些名稱空間。名稱空間是一種命名方案,幫助我們組織應用程序可用的各種類。你可以使用一些被默認引入的名稱空間的指令,而不需要鍵入其全部冗長的前綴。
在Microsoft.VisualBasic 名稱空間中,有許多是我們VB開發人員慣于使用的。要想知道我在說些什么,請到代碼窗口,鍵入Microsoft并跟隨一個句號。這時你會面臨兩個選擇:Win32和VisualBasic。如果你鍵入了VisualBasic并且再一次按下句號,就會看到我們這些編碼人員所熟悉的全部函數列表了。
所以,如果你想使用我們在VB6時代就了解的StrReverse函數,就應該執行下列這串代碼:
MessageBox.Show(Microsoft.VisualBasic.StrReverse("Karl Moore"))
首先,讓我解釋一下這種類的"組織"有許多優越性。作為一個開端,它是有組織的。而且,還可以避免命名的沖突,從而在所有的語言之間獲得了一個共同的基礎。
在默認狀態,Microsoft.VisualBasic名稱空間中所有的指令都是默認引入的,這就意味著你只需要使用它們的名稱,而可以跳過Microsoft.VisualBasic 這個前綴。
引入一個名稱空間時可以在你的表單或組件中指定"Imports 什么.什么",也可以在工程文件屬性中指定引入。"Imports"是一種免去你鍵入全部冗長的前綴的一種方法。事實上,它同你已經了解并喜愛的"With"語句非常相似。
并不只是有 Microsoft.VisualBasic 名稱空間,還有System(系統)名稱空間... 它們下面有無窮多個指令。
有時候你會想要使用一個不是默認引入的名稱空間中的功能,這時候你就需要"引入"它或是用完整的"名稱空間路徑"來引用它。如果正在進行圖形方面的工作,你也許會對 System.Drawing.Graphics 名稱空間感興趣。如果在操作數據庫,也許你會想要仔細研讀System.Data.ADO。也許想要保存舊的Visual Basic代碼,那么就應該查看Microsoft.VisualBasic.Compatibility.VB6 名稱空間。

新的名稱空間會不斷出現,你的"VB專家地位"會根據你所了解的現有名稱空間的數量而發生變化。
好,現在你已經知道名稱空間了。以我的觀點來看,這是VB.NET中最大的轉變。
接下來,將進入我認為是實際編碼語法的重大轉變部分。我將給你指出幾點你應該注意的問題。
編碼的核心轉變
在編碼中,有哪些轉變是你所需要了解的呢?除了名稱空間以外,我們再來回顧一下可能會對你帶來影響的其它資源:
l Longs, Integers :過去的Long變成了Integer,過去的Integer變成了所謂的Short。VB.NET 中新的Long 可容納64位。
2 Byte, Char:新的Byte 數據類型可容納 0 到255之間的數字。新的Char 數據類型消耗2個字節的空間,可容納一個Unicode 字符。
3 Variants消失了:代替它的是普通的Object數據類型,實際上它現在可以容納任何內容,同時它也不象VB6占用的內存那么多。
4 Currency 的替代物:在VB.NET 中,Currency數據類型不再存在,它被更強大的128位Decimal(十進制)數據類型所代替。
5 變量聲明:在VB6中,"Dim X, Y, Z As Integer" 的結果是兩個Variants和一個Integer。但是在VB.NET中,這會帶來三個Integers(記住,這就是過去的Longs)。
6 基于0的數組:許多人對此都有所抱怨并且面臨改變。VB.NET中的數組是基于0的,這意味著它們總是從0開始。所以類似于 "Dim MyArray(10) As Integer" 這樣的代碼帶來的結果是一個有11個元素的Integer數組:從0到10。
注意:要想聲明"表單層次"范圍內的變量和數組,就要將它們放置在'New'方法之前,這個方法是在代碼窗口中自動生成的。這是過去的Declarations區域。
7 UDT 的改變:自定義類型非常有用。但是將來聲明自定義類型時,需要使用類似于API關鍵字結構,而不能使用Type。下面是如何聲明一個UDT的舉例:
Structure MyStructure
Public Name As String
Public Age As Byte
End Structure
7 Collection消失了:VB.NET不支持我們所了解的Collection對象。相反,它在System.Collections 名稱空間中提供了一系列新的集合類型,其中最相似的是HashTable和 ObjectList。但是使用Compatibility名稱空間時你可以使用舊的Collection 對象,就象這樣:
Dim MyCol As Microsoft.VisualBasic.Compatibility.VB6.Collection
MyCol.Add("My Information")
8 新的操作符:VB.NET帶來了一些新的數學操作符,從而縮減了代碼。如VB.NET中的 "X += 4"與VB6中的 "X = X + 4" 作用相同。試試這些: "X -= 10, X *= 2", "X /= 13", "X =13", "X ^= 3", "X &= " OK"。
9 短循環:VB.NET 存在短循環If...Then聲明。如果你的If...Then 有兩部分,而第一部分返回了False,VB.NET就不再理會第二部分了。
10 沒有Set:在VB6中,我們經常使用Set聲明,它是用來設置其它常規數據類型以外的對象的。在VB.NET,任何事物都是一個對象,所以不再需要這個聲明了。如果你真的鍵入了,VB.NET會為你將其刪除。
11 屬性聲明:現在聲明屬性不一樣了,不再用單獨的Lets 和 Gets。下面是一個新的屬性程序的例子,請注意Value現在是一個關鍵字,總是包含著傳遞給這個屬性的值:
| Public Property MachinePart() As String Set mstrName = Value End Set Get MachinePart = mstrName End Get End Property |
12 錯誤處理:在VB.NET中連錯誤處理也改變了,你將使用一個 Try、Catch和Finally的結構。如果發生了錯誤,運行 Try區內的代碼,Catch 區內的代碼也被運行。不管發生什么,Finally區總是要運行的。這對于VB 程序員來說是個奇怪的概念,但是對于C和 Java程序員卻很平常。我建議你使用VB.NET幫助索引來找到錯誤處理,瀏覽一下"意外處理介紹"。一定要找到 'Try...Catch...Finally statement'那部分,并測試提供的例子。
13 默認 ByVal:在默認狀態,現在所有的參數都是以值來傳遞,而不是以引用傳遞的。為了安全起見,要使所有的聲明都很明確。
No .Show:不再有一個簡單的Form.Show方法。VB.NET中的一切都是對象,因此你需要實際的 'Dim FormName As New Form1',然后執行一個'FormName.Show'。
14 Garbage Collection(垃圾回收):當操作系統(.NET 框架)認為該清除對象引用一類的東西時就會運行Garbage Collection程序。在VB6中,當你將一個對象設置為Nothing時,它就立刻從內存消失。但是在VB.NET中,這并不是馬上發生的。在被垃圾回收器終止之前,你的對象還會存活幾分鐘,所以你總是不能特別肯定類的終止代碼是什么時候運行的。雖然這看起來有點奇怪,但是這種非決定性的終結確實有其優勢,例如自動地糾正循環引用。
l5 Return關鍵字:在一個函數內部,你不向返回值或對象設置函數,而是簡單地聲明"Return MyData",這樣就允許你不修改實際代碼就可以改變函數名。
注意:別忘了,大部分舊的VB6功能在VB.NET中還是可以使用的,只是通過Microsoft.VisualBasic.Compatibility.VB6名稱空間引用就可以了。但是同往常一樣,如果你用新的更通用的函數可以進行下去的話就更好了。
結 論
以上我們進行了一個令人愉快的VB.NET之旅。我們提到了Windows表單、新的控件、屬性的變化、Anchoring和 Docking以及視覺的繼承。然后我們進行到名稱空間和VB.NET中各種代碼的變化,同時繼續學習了開發環境的更多內容。還有很多激動人心的內容,但是別忘了運行、運行、再運行,發現和探索,自己去找到奇跡!