VB.net 新功能,例程 (翻譯)
2024-07-10 13:04:35
供稿:網(wǎng)友
 
7.介紹vb.net
vb.net 或者說 vb7 有許多和舊版本的visual basic 一樣的語法,但是在許多方面,它是一門全新的語言。和vb先前的版本不一樣,vb7是完全的面向?qū)ο蟮模恍┢胀ǖ牟僮鞯膶?shí)現(xiàn)因?yàn)檫@個不同而出現(xiàn)一些區(qū)別。出于這種原因,與其將它當(dāng)成一個編譯器來編譯你已經(jīng)寫好的程序,不如最好將vb.net當(dāng)作是一種開發(fā).net應(yīng)用程序的語言。由于vb.net的格式還是不成熟的,因此在本文中當(dāng)我們談到vb.net時,我們將用vb7來命名vb.net。(我們將在小標(biāo)題中延續(xù)vb.net的名字),然而,這本章中我們將要看到vb7的優(yōu)勢。在下一章中,我們將要看到它多么簡單地訂制設(shè)計模式來構(gòu)筑有用的面向?qū)ο蟮膙b程序。
vb.net的語法不同
在這個版本中的主要的不同點(diǎn)是那些子程序和類方法必須加上圓括號。在vb6中我們能這樣寫:
  dim mycol as new collection
  mycol.add "mine"
  然而,在vb7中,你必須在參數(shù)上添加括號:
  dim mycol as new arraylist
mycol.add ("mine")
另一個顯著的不同,對大多數(shù)人來說是一個改進(jìn)工作,參數(shù)傳入子過程默認(rèn)是用傳值來代替?zhèn)髦贰Q句話說,你能操作變量在子程序中而不必?fù)?dān)心在調(diào)用它的程序中的變量值會改變。再換句話說,以前要被修正的“byval”現(xiàn)在是默認(rèn)的了。實(shí)際上,開發(fā)環(huán)境在大多數(shù)情況下自動從你的程序插入傳值參數(shù)到調(diào)用的子程序中,如果你想要在程序中改變值,你依然能聲明是一個參數(shù),修正為傳址的。
四個其他的vb6的關(guān)鍵字也被去除或顯著的改變了:set, variant, wend, endif。事實(shí)上,開發(fā)環(huán)境只是去除了動詞set在任何你使用它的行的開始處。
從現(xiàn)在開始,dim聲明允許你將屬于同一個類型的幾個變量中同時在一個單一的聲明中列出。
dim x, y as integer
你不再能夠在同一個單一的聲明中列出不同類型的變量。
dim x as integer, y as single 'illegal in vb7(vb7中非法)
你現(xiàn)在必須在不同的行中列出它們
  dim x as integer 'legal in both vb6 and vb7
dim y as single
vb7的編譯器將把許多的vb6上的構(gòu)造用法標(biāo)示為錯誤的。然而,它會簡單地忽略附加的“as”聲明在同一個dim聲明行。另外,字符函數(shù)instr, left 和 right 已經(jīng)被字符類方法 indexof 和 substring 進(jìn)行了補(bǔ)充替代了,使之變得更萬能。注意那些以0作為字符索引下標(biāo)的方法。
vb6               vb7
instr(s, ",")     s.indexof(",")
left(s, 2)       s.substring(0,2)
right(s, 4)      s.substring(s.length() 4)
改進(jìn)的函數(shù)語法
在vb中,在從一個函數(shù)返回值時,需要提供函數(shù)名
public function squarit(x as single)
 squarit = x * x
end function
在vb7中,著這個限制最終被取消了,你能象在其他語言中一樣簡單地返回函數(shù)值:
public function squarit(x as single)
return x * x
end function
這使得函數(shù)更容易被定義和使用。
在vb.net中的對象
在vb7中,任何東西被當(dāng)成對象。當(dāng)在vb6中,你能夠創(chuàng)造一個類實(shí)例,將它當(dāng)對象來使用。對象能通過包含的數(shù)據(jù)和方法來操作。在vb7中,所有的變量都真是這樣的。.舉例說明,字符也是對象,它們有這樣的方法:
substring
tolowercase
touppercase
indexof
insert
tosingle
toint32
再深入一點(diǎn),integers , single 和 double 變量也是對象,它們有方法
dim s as string
dim x as single
x = 12.3
s = x.tostring
實(shí)際上,你甚至能將常量也當(dāng)成對象來對待
dim snum as string
snum = 9.tostring
注意到,現(xiàn)在字符和數(shù)字類型的轉(zhuǎn)換能使用對象方法了,不需要象以前那樣用val 和str函數(shù)了。如果你想要將一個數(shù)字格式化成一種字符,每一種數(shù)字類型有一個格式化方法:dim s as stringdim x as single
x = 12.34
s = single.format(x, "##.000")
vb.net中的數(shù)
所有的沒有小數(shù)點(diǎn)的數(shù)都被假定成int32類型,所有小數(shù)點(diǎn)的數(shù)都被假定成double類型。如果你想要將一個single變量定義成一個小數(shù),你必須在數(shù)字的后面跟上一個“f”(浮點(diǎn))。
dim time as single = 123f
一般地說,vb.net的編譯器要求變量聲明用以防止大多數(shù)的不清楚的類型轉(zhuǎn)化(除去轉(zhuǎn)化成更寬的類型)。你總是能夠?qū)nteger轉(zhuǎn)化成single和double類型。然而,如果你想要將single轉(zhuǎn)化成integer,你就必須明確提出你的意思。
dim k as integer = time.toint16
vb6和vb.net 的屬性
visual basic提供了一種結(jié)構(gòu)叫屬性,類似于其他語言中的getxxx和setxxx方法。在vb6中,你能夠用名字指明一個屬性,定義get和let方法。這倆個方法允許你給一個私有變量賦值,并允許你取得它的值。
property get fred() as stringfred = frednameend property
property let fred(s as string)fredname = send property當(dāng)然,你能夠在前期和后期處理中使這些數(shù)據(jù)生效或?qū)⑺鼈冝D(zhuǎn)化成需要的形式。
在vb7中,這些屬性被組合成一個單一的程序:
property fred() as stringgetreturn frednameend getsetfredname = valueend setend property
注意這些關(guān)鍵值。我們將在vb7中用它來被傳入屬性的值。因此如果我們這樣寫
abc.fred = "dog"
然后,當(dāng)屬性中的set代碼被執(zhí)行時,字符變量的值將包含“dog”。
在兩者的系統(tǒng)中,這個效果用來提供一個簡單的接口,它可以在不知道數(shù)據(jù)如何確切存儲的時候從類中取出數(shù)據(jù)或?qū)?shù)據(jù)存入類中。你能使用這些共同分配聲明的屬性。如果“fred”是一個boy類的屬性,那么,你能這樣寫聲明:
dim kid as boy
kid.fred = "smart"
然后
dim brain as string
brain = kid.fred
一般說來,屬性系統(tǒng)提供了一個交替的語法讓你能不費(fèi)力地寫getfred和setfred函數(shù)。當(dāng)語法不同時,除了本地的vb對象有勝于get和set方法之外,沒有什么顯而易見的優(yōu)勢。在這本書中,我們將不會太多使用這種屬性,因?yàn)樗鼈儾皇窃趯懨嫦驅(qū)ο蟮某绦虼a時的重大的優(yōu)勢。
速記平等語法
vb7采用了我們能在 c,c++,c#和java中能發(fā)現(xiàn)的速記平等語法。它允許你不用在將一個變量加,減,乘,除一個常數(shù)時,寫兩次變量名。
i += 5 'add 5 to i
i -= 8 'subtract 8 form i
i *= 4 'multiply i by 4
你能用這種途徑來減少寫代碼,但這種代碼確實(shí)和你用老的方式寫的代碼產(chǎn)生同樣的效果
i = i + 5
i = i - 8
i = i * 4
這同樣的應(yīng)用也可以用于除法,但你幾乎看不到這樣的用法,因?yàn)樗鼈兛勺x性較差。
管理語言和內(nèi)存回收
vb.net 和 c# 都是管理語言。它們有兩個重要的含意。首先,它們都被編譯成一個中間的低級語言,一種公共的語言運(yùn)行時間(clr)被用來執(zhí)行編譯過的代碼,或許在更早時就完成了編譯。因此,不但vb7而且 c#同時分享了運(yùn)行時間庫,它們很大程度上就象一枚硬幣上的兩個面,一個語言系統(tǒng)上的兩個方面。他們的不同點(diǎn)是vb7更象是visual basic,它更容易學(xué)習(xí)和使用。c#更象c++和java,有這些語言經(jīng)驗(yàn)的程序員更傾向于用c#。
另一個管理語言的含意是內(nèi)存回收。內(nèi)存回收語言將自動釋放不用的內(nèi)存,使你不必關(guān)心這個問題。當(dāng)內(nèi)存回收系統(tǒng)發(fā)現(xiàn)一個變量,數(shù)組,對象不再被使用,它將釋放內(nèi)存給系統(tǒng)。你再也不需為因?yàn)榉峙鋬?nèi)存而未及時釋放而造成內(nèi)存不夠而緊張。當(dāng)然,大量消耗內(nèi)存的代碼還是有可能存在的,但大多數(shù)情況下,你不必為分配和釋放內(nèi)存而擔(dān)心了。
vb.net中的類
類是vb7中一個很重要的部分。幾乎每一個重要的程序中都包含一個或多個類。在vb7中類和窗體之間的區(qū)別已經(jīng)消失了,許多程序?qū)⑷坑深悩?gòu)成。既然每一個東西都是類,那么類對象的名稱的數(shù)量將是無法控制的。他們被分組在多個不同功能的庫文件中,在使用庫時,你必須十分明確指出他們的位置。
從深層次上看,這些庫都是彼此獨(dú)立的動態(tài)鏈接庫。然而,你僅僅需要用他們的基礎(chǔ)的名稱來引用他們,然后這些庫中的所有函數(shù)你都可以用了。
imports system.collections 'use collection namespace classes
理論上,每一個庫都有一個不同的名稱空間,每一個名稱空間都包含了一個獨(dú)立的類和方法名稱的組,當(dāng)你引用了名稱空間之后,編譯器會認(rèn)出你所要用的類函數(shù)或方法。但在你引用了多個包含有相同的類和方法名的名稱空間后,當(dāng)你試著用一個在多個名稱空間中都有的同名函數(shù)或方法時,你將被告知有沖突。
最常用的名稱空間是系統(tǒng)內(nèi)部名稱空間,你不需要引用這些默認(rèn)的名稱空間。它包含了很多的基礎(chǔ)的類和方法在vb7中將要被使用的,例如,應(yīng)用程序,數(shù)組,控制臺,異常,對象和字節(jié),邏輯,單精度數(shù)和雙精度數(shù),字符等標(biāo)準(zhǔn)對象。在最簡單的vb7程序中我們能夠在控制臺上打印“hello vb world”而不需要建立窗口:
imports system 'this one is optional
'simple vb hello world program
public class cmain
shared sub main() 'entry point is main
' write text to the console
console.writeline ("hello vb world")
end sub
end class
著個程序僅僅在命令(dos)窗口上打印“hello vb world”。任何程序的入口處必須是一個main函數(shù),在一個模塊中,它必須被聲明成共享的。在vb7中從前的模塊類型只有module類型。程序能這樣寫:
'simple vb hello world program
public module cmain
sub main() 'entry point is main
' write text to the console
console.writeline ("hello vb world")
end sub
end module
除了一個模塊擁有共用的(共享的)方法,main函數(shù)不用聲明成共享的以外,一切都一樣。vb7中的模塊類似與以前的模塊,它們都會被vb生成一個.bas類型的文件。他們有一個優(yōu)勢就是在模塊中被聲明的方法和變量常量能夠在整個程序中被使用。然而,和類不同,他們沒有提供可以隱藏信息和運(yùn)算法則的方法,下面將不再介紹和使用了。
在vb6,類名通常聲明了文件名,盡管你可以修改類名的屬性。在 vb7中,類的關(guān)鍵字允許你而不需考慮文件名,實(shí)際上,你必須為每個類聲明一個類名。在vb6中類的默認(rèn)擴(kuò)展名是.cls 窗體的默認(rèn)擴(kuò)展名是.frm。在vb7中你能夠使用任何擴(kuò)展名,但默認(rèn)的是.vb。
建造一個vb7應(yīng)用程序
讓我們從建造一個簡單的控制臺應(yīng)用程序開始:那是一個沒有任何窗口應(yīng)用程序,他僅僅以命令行的方式運(yùn)行。打開visual studio.net程序,選擇file|new project。從選擇框中選擇控制臺程序就象 圖7-1中所示:
圖7-1 在新工程的選擇框中選擇一個控制臺應(yīng)用程序
這樣將生成一個模塊,已經(jīng)有了main過程,現(xiàn)在請加入以下代碼:
module cmain
sub main()
'write text to the console
console.writeline("hello vb world")
end sub
end module
你能按f5編譯和執(zhí)行這個程序。如果你想改變這個程序的主模塊的名字就象我們做的那樣,從module1到cmain,你將不得不在啟動模塊的選項(xiàng)中改變模塊名。為了這樣做,在solution explorer浮動面版中右單擊工程名,從彈出菜單中選擇properties選項(xiàng),將會出現(xiàn)圖7-2 工程的屬性頁:
你能在下拉式菜單中選擇正確的新名稱。當(dāng)你按f5 編譯程序時,一個dos 將出現(xiàn)并打印信息“hello vb world”,然后退出。
你也能刪除這個模塊,用插入一個類來代替。
public class cmain
shared sub main()
console.writeline("hello classy vb world")
end sub
end class
這個能用同樣的方式編譯和運(yùn)行。
 
圖7-2 工程的屬性頁
在vb.net中編寫最簡單的窗口程序
寫一個有窗體框架的程序是很簡單的。實(shí)際上,你能用windows designer創(chuàng)建大多數(shù)的應(yīng)用程序。為了這樣做,打開visual studio.net,選擇file|new project,然后選擇windows application。默認(rèn)的文件名稱是windowsapplication1,但在你關(guān)閉新建對話框前,你能改變名稱。這樣就建立了一個簡單的工程,初始化了form1.vb的窗體。然后你能用工具箱在窗體上添加控件就象在vb6中那樣。
在圖7-3中 窗體設(shè)計中有一個含有倆個標(biāo)簽,一個文本框,一個按鈕的簡單窗體你能將控件放在窗體上,通過雙擊控件來進(jìn)入代碼設(shè)計。在這個簡單的窗體上,我們單擊“say hello ”按鈕,他將文本框中的內(nèi)容復(fù)制到空白的我們命名為 lbhi的標(biāo)簽中,然后清空文本框。
protected sub sayhello_click(byval sender as object, _
byval e as system.eventargs)
lbhi.text() = txhi.text
txhi.text = ""
end sub
代碼的生成可能有點(diǎn)不同。注意單擊動作傳入了一個接收對象(sender)和一個事件對象(e),讓你能詢問進(jìn)一步的信息。運(yùn)行時的程序如圖7-4所示。
 
圖7-3 visual studio.net的窗體設(shè)計
 
圖7-4 簡單的 hello 程序的按下 say hello 按鈕前后的效果
雖然我們只需要寫倆行代碼到上面的子過程,但看一下程序中剩下的代碼和以前的不同還是很有意義的。首先我們看到幾個類庫被引入了程序使得整個程序都可以用到它們:
imports system.componentmodel
imports system.drawing
imports system.winforms
最重要的是winforms這個類庫,它是整個.net共同使用的。你能在c#(c-sharp)和c++用vb 的窗體設(shè)計。
繼承
接下來,我們必須來看一下vb-7中最好的改變:繼承。
public class helloform
inherits system.winforms.form
我們現(xiàn)在建立的窗體是form 類的一個子類,并不是象以前的vb 版本那樣只是一個類的實(shí)例。這就有了很大的意義。你能創(chuàng)建可視化的對象,通過重載屬性來使得它們有不通的功能。我們將簡略地看一些例子。