VB編程語言入門學(xué)習(xí)_第1頁
VB編程語言入門學(xué)習(xí)_第2頁
VB編程語言入門學(xué)習(xí)_第3頁
VB編程語言入門學(xué)習(xí)_第4頁
VB編程語言入門學(xué)習(xí)_第5頁
已閱讀5頁,還剩21頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、VB.NET之旅(一失蹤的窗體好久沒有新作,架不住兄弟們的問詢與詰問,只得拿些舊作來補(bǔ)上近來沒空寫作的缺乏。羞愧ing!這一系列與Henry手記系列不一樣,是一個(gè)人物辦法的情形故事,開端發(fā)表于計(jì)算機(jī)國際,適用于VB.net 初專家,老鳥們就不必在我這一系列的文章上浪費(fèi)時(shí)間了。我期望自個(gè)有時(shí)間今后,能不斷持續(xù)這一系列的文章,參加許多的工程處理方案。一起,我的Henry手記也會(huì)持續(xù)寫下去,以報(bào)答長時(shí)間以來撐持我的一切兄弟。布景:我叫Henry,剛從大學(xué)計(jì)算機(jī)專業(yè)結(jié)業(yè),新參加索易公司的.NET開發(fā)小組;擔(dān)任帶我的嘍羅是大李,.NET高手,是個(gè)詼諧又有耐性的家伙;老白是咱們有些的頭頭,常常帶給咱們乖僻

2、又難纏的需求。榜首天上班,白司理就帶著我去.NET技能小組簽到?!按罄?這是新來的同事,你要多幫幫他。”老白指著我對(duì)一個(gè)眼鏡后邊透著閃閃目光的年輕人說?!皼]疑問,他會(huì)做得極好的?!贝罄钅菚?huì)看相不成?仍是人家謙讓呀?不論了,我只需自個(gè)盡力就對(duì)了。20分鐘后,我現(xiàn)已在分配給我的一臺(tái)P4電腦,WindowsXP平臺(tái)下翻開了Visual Studio.NET的集成編譯環(huán)境(IDE開端賞識(shí)了。一個(gè)多美麗的編譯環(huán)境呀,能夠自選運(yùn)用時(shí)的個(gè)性是VB6的還是VC6的。我挑選的是RAD功用好的VB6個(gè)性?!澳銊傞_端觸摸.NET,在系統(tǒng)訓(xùn)練之前先加深點(diǎn)形象,看看VB.NET與VB6有啥不一樣吧。你創(chuàng)立兩個(gè)窗體,每

3、個(gè)窗體上各有一個(gè)按鈕,點(diǎn)擊時(shí)躲藏其地址的那個(gè)窗體,切換出另一個(gè)窗體來。”大李的聲響在耳邊響起,打斷了我對(duì)IDE的賞識(shí)。但他提的需求也太簡略了吧,在VB6中只需求兩句寫在按鈕的單擊呼應(yīng)中的句子就行了:兩個(gè)窗體:Form1與Form2。Form1上的按鈕為: Command1,Form2上的按鈕為: Command2 Private Sub Command1_Click(Me.HideForm2.ShowEnd SubPrivate Sub Command2_Click(Me.HideForm1.Show在描繪窗口雙擊Button1后,編譯器會(huì)切換到代碼窗口的Button1的單擊呼應(yīng)代碼中。在代碼

4、段中故計(jì)重施,當(dāng)我想寫Form2.Show時(shí),在Form2之后打個(gè)點(diǎn),呈現(xiàn)的智能感知菜單中,卻沒有Show這一辦法。真新鮮,這怎樣能夠?莫非VB.NET改動(dòng)有這么大。我昂首看了看站在我身旁的大李。大李馬上面露淺笑,看來是正中他的騙局。他手指向屏幕,點(diǎn)了點(diǎn)Form1中的代碼的最初處:PublicClass Form1手:Private SubButton1_Click(ByVal sender As System.Object,_ByVal e As System.EventArgsHandles Button1.ClickMe.Hide(Dim frm2As New Form2(實(shí)例化Form

5、2類,得到一個(gè)目標(biāo)frm2.Show(End Sub在Form2的Button2的單擊工作中也相似地寫了一段代碼,運(yùn)轉(zhuǎn)一下,和VB6的效果差不多了。正在得意中,大李走過來,在我的Form1中增加了一個(gè)文本框textbox1,清空其間的文字。然后運(yùn)轉(zhuǎn)了一下程序。在運(yùn)轉(zhuǎn)中,他在文本框里寫了幾個(gè)字:“Henry的著作”,然后點(diǎn)擊Button1切換到Form2,接著點(diǎn)擊Button2,從頭呈現(xiàn)的Form1的文本框中卻變成了空白?!斑@”我一時(shí)語塞,慢慢地想起點(diǎn)啥,“大概是程序經(jīng)過New布局辦法,每次點(diǎn)擊按鈕都會(huì)從頭實(shí)例化一次Form類吧?所以每次從頭呈現(xiàn)的窗體都不是從前從前呈現(xiàn)過的那個(gè)。那從前的窗體也就

6、失蹤了,調(diào)不出來了?!薄笆й?”大李不由笑了起來,“對(duì)呀,失蹤在內(nèi)存中。你每實(shí)例化一次,系統(tǒng)就會(huì)拓荒一塊內(nèi)存給一個(gè)目標(biāo),并會(huì)有相應(yīng)的線程對(duì)其進(jìn)行操控與辦理。若是作為進(jìn)程中主線程的榜首個(gè)Form1被Hide起來,沒有封閉它,那么即便你封閉后來新創(chuàng)立的一切窗體,進(jìn)程也不會(huì)被間斷。那么,用啥辦法去找回你失蹤的窗體,或許說怎么就只運(yùn)用一個(gè)目標(biāo),不再每次實(shí)例化呢?”“大局目標(biāo)!”我脫口而出,感受到大李模棱兩可,只好硬著頭皮持續(xù)說:“運(yùn)用大局變量,使Form1與Form2只實(shí)例化一次,這樣就能夠了?!比缓?在大李的注視下,我開端施行我的方案:再創(chuàng)立一個(gè)模塊文件:module1.vb,并且同時(shí)在:處理方案辦

7、理器-項(xiàng)目名.sln -右點(diǎn)鼠標(biāo)-特點(diǎn)-通用屬性->慣例->發(fā)動(dòng)目標(biāo)-改為Module1。讓程序發(fā)動(dòng)后先運(yùn)轉(zhuǎn)Module1中的代碼指令,然后編寫代碼如下:'Module1.vbModule Module1Public frm1As New Form1(界說Form1的共用變量實(shí)例Public frm2As New Form2(界說Form1的共用變量實(shí)例Sub Main(Application.Run(frm1這句話標(biāo)明程序發(fā)動(dòng)了modele后,會(huì)接下來運(yùn)轉(zhuǎn)frm1,即form1的一個(gè)實(shí)例。主線程就變成運(yùn)轉(zhuǎn)期的frm1了。End SubEnd Module這樣一來,frm1

8、、frm2就變成大局變量了,在Button1與Button2的單擊呼應(yīng)代碼中只需寫:frm1.show就能夠了。再運(yùn)轉(zhuǎn)程序,可以了,“Henry的著作”一向都會(huì)保持在Form1中的文本框里。大李老哥沒等我歡笑起來就再次出手,在frm1躲藏起來的時(shí)分,封閉了Form2窗口(frm2實(shí)例,桌面上啥窗體都沒有了,進(jìn)程又一次被墮入在無法間斷的狀況下。My God,面向目標(biāo)的VB.NET,愛你莫非真的這么難VB.NET之旅(二布局與析構(gòu)在Form1窗體的實(shí)例被躲藏的時(shí)分,封閉了Form2窗體的實(shí)例,使我失去了對(duì)主線程的人工操控,進(jìn)程無法正常封閉了。只好運(yùn)用Ctrl+Alt+Del調(diào)出系統(tǒng)進(jìn)程辦理器,強(qiáng)行

9、間斷了該進(jìn)程。為了防止昂首看見大李的笑臉,我只好垂頭想辦法。有了,我只需能截獲Form2實(shí)例封閉的音訊,不就能夠再調(diào)出躲藏的主線程窗體了嗎?在Form2的基類事件(Base Class Event中重載Closing辦法進(jìn)行處置:Private Sub Form2_Closing(ByVal sender As Object,ByVal e As_frm1.Show(End Sub哈,很便利,我封閉了Form2窗體的實(shí)例后,被躲藏的那個(gè)frm1又呈現(xiàn)了?!班?”大李總算發(fā)話了,“你再點(diǎn)擊一下Form1窗體上的Button1試試。”我背心一涼,隱約感受大李等待著的即是這個(gè)時(shí)分。無法的我還只能照他

10、說的去做。公然,彈出一個(gè)出錯(cuò)窗口.“你封閉了frm2這個(gè)Form2的實(shí)例,也就完畢了這個(gè)目標(biāo)的生存期,”大李看來是蓄勢已久了,“這即是犯錯(cuò)提示中所說的無法拜訪名為Form2的已處置目標(biāo)。當(dāng)咱們封閉一個(gè)窗口的時(shí)分,會(huì)宣布一個(gè)終止呼應(yīng),并將該窗口目標(biāo),就象上面界說的frm2,送入停止行列,公共言語運(yùn)行庫的廢物收回器盯梢著這個(gè)目標(biāo)的生存期,此刻就會(huì)調(diào)用此目標(biāo)基類,比方Form2的Dispose辦法,用于毀掉目標(biāo)并收回資源。所以”“所以我只需判別一下frm2是不是被毀掉就行了,若是毀掉了,我就再布局一個(gè)實(shí)例不就行了?”我恍然大悟道。大李首次淺笑地址了答應(yīng)說:“用frm2.IsDisposed就能夠來判

11、別了?!蔽倚恼詹恍貙懙?Private SubButton1_Click(ByVal sender As System.Object,_ByVal e As System.EventArgsHandles Button1.ClickIf frm2Is Nothing Or frm2.IsDisposed Then判別目標(biāo)是不是被毀掉frm2=New Form2(End IfMe.Hide(frm2.Show(End Sub這下完善多了,兩個(gè)窗體之間的切換也不會(huì)有這么多別扭的疑問了。我轉(zhuǎn)過身,看到大李現(xiàn)已找了把椅子坐在我的身邊?!澳銇碚f說,對(duì)VB.NET的窗體實(shí)例的創(chuàng)立與毀掉的進(jìn)程吧。”我整理

12、了一下雜亂的思路,長吁了一口氣,開端說:“一個(gè)窗體類,比方Form1類是經(jīng)過調(diào)用其基類,就是Form類的New辦法來創(chuàng)立實(shí)例、Dispose辦法來毀掉實(shí)例。”“沒錯(cuò)?!贝罄钸呎f話,一邊在我的程序中點(diǎn)擊開來被代碼窗口主動(dòng)折疊起來的" Windows 窗體描繪器生成的代碼":Public Sub New(MyBase.New('該調(diào)用是Windows窗體描繪器所必需的。InitializeComponent('在InitializeComponent(調(diào)用之后增加任何初始化End Sub'窗體重寫處置以整理組件列表。Protected Overloads

13、 Overrides Sub Dispose(ByVal disposingAs BooleanIf disposing ThenIf Not(components Is NothingThencomponents.Dispose(End IfEnd IfMyBase.Dispose(disposing辦法值得一說?!痹?。當(dāng)它參數(shù)中的disposing 為true 則開釋保管資源和非保管資源;為false 則僅開釋非保管資源。Form類的disposing為true。在封閉窗體時(shí)主動(dòng)調(diào)用dispose的功用是得益于.net的公共語言運(yùn)轉(zhuǎn)庫,運(yùn)行庫主動(dòng)處置目標(biāo)規(guī)劃和辦理對(duì)目標(biāo)的引證,當(dāng)不再運(yùn)用目

14、標(biāo)時(shí)釋放它們。其生存期以這種辦法來辦理的目標(biāo)稱為保管數(shù)據(jù)。主動(dòng)內(nèi)存辦理消除了內(nèi)存走漏以及其他一些常見的編程過錯(cuò)。任何類型的Dispose 辦法都大概開釋它具有的一切資源。它還大概經(jīng)過調(diào)用其父類型的Dispose 辦法開釋其基類型具有的一切資源。該父類型的Dispose 辦法大概開釋它具有的一切資源并一樣也調(diào)用其父類型的Dispose 辦法,從而在整個(gè)基類型層次布局中傳達(dá)該辦法。要保證始終正確地整理資源,Dispose 辦法大概能夠被屢次安全調(diào)用而不引發(fā)任何反常?!薄翱墒?若是系統(tǒng)疑問或應(yīng)用程序調(diào)用上出了疑問,不能正常調(diào)用Dispose怎樣辦?”我想起了啥,問道?!叭羰墙?jīng)過Dispose還開釋不

15、潔凈或沒有調(diào)用Dispose,系統(tǒng)的廢物收回器會(huì)調(diào)用目標(biāo)的Finalize 辦法進(jìn)行鏟除。由于履行Finalize 辦法會(huì)大大減損功用,所以咱們不會(huì)一開端就用它去進(jìn)行鏟除作業(yè)?!贝罄盥晕⒄f明了一下。我總算想起了一個(gè)重要的疑問:“若是總是在模塊中界說的大局變量來處置,由于拜訪規(guī)模太大,會(huì)不會(huì)有安全性的疑問?”“當(dāng)然,咱們能夠試試其他的處理方案?!笨偸怯袀涠浴B.NET之旅(三同享成員一起對(duì)VB.NET充滿了獵奇與曉得的巴望?!俺舜缶肿兞客?還有啥好辦法嗎?”我迫不急待地想知道成果?!澳軌蜻\(yùn)用同享成員?!贝罄钜廊皇悄敲吹?“VB.NET如今是撐持真實(shí)的面向目標(biāo)編程,能夠承繼、運(yùn)用多態(tài)、同

16、享成員和靜態(tài)成員。同享成員即是在一切類和所界說派生類的實(shí)例之間同享的辦法、屬性、字段和工作。一切運(yùn)用類創(chuàng)立的目標(biāo)都能夠拜訪一樣的數(shù)據(jù)、同享完結(jié)進(jìn)程,并且收到一樣的激起工作?!薄斑@么好呀,那怎樣完結(jié)呢?”我好象又回到了課堂上,滿腦都是無知的符號(hào)?!昂芎喡?在Public或Private成員潤飾符后加上Shared關(guān)鍵詞即可了。Shared關(guān)鍵詞指示一個(gè)或多個(gè)被聲明的編程元素將被同享。同享元素不關(guān)聯(lián)于某類或布局的特定實(shí)例。能夠經(jīng)過運(yùn)用類名或布局稱號(hào)或許類或布局的特定實(shí)例的變量稱號(hào)限制同享元從來拜訪它們。你來看這段代碼Public Class ShareClassPublic Shared Shar

17、edValue As StringPublic Shared Sub ShareMethod(MsgBox("This is a shared method."End SubEnd ClassSubTestShared(Dim Shared1As New ShareClass('創(chuàng)立了類的一個(gè)實(shí)例.Dim Shared2As New ShareClass('創(chuàng)立了類的第二個(gè)實(shí)例.Shared1.SharedValue="Share Value1"'給同享字段賦值.Shared2.SharedValue="Share Va

18、lue2"'重寫同享字段的值ShareClass.ShareMethod('不必創(chuàng)立實(shí)例就能夠調(diào)用類的辦法.End Sub“有兩個(gè)關(guān)鍵,一個(gè)是同享成員若是是辦法或特點(diǎn),我們不必創(chuàng)立實(shí)例就能夠直接用類名.共享成員的辦法進(jìn)行調(diào)用;第二個(gè)關(guān)鍵,同享字段是僅有的,你來說說運(yùn)轉(zhuǎn)后Shared1.SharesValue的值是多少?”“沒錯(cuò)!”大李又一次綻放了會(huì)意的淺笑,真是對(duì)我的最高獎(jiǎng)勵(lì)?!澳悄氵€不著手修正一下你的程序?”好!說做就做。已然同享特點(diǎn)在其調(diào)用的時(shí)分是不必實(shí)例化的,那么我最佳能憑借布局一個(gè)同享特點(diǎn)來完結(jié)。并且要能夠判別其實(shí)例是不是存在或是不是被毀掉,若是不存在就布局一

19、個(gè)新的窗體實(shí)例,若是存在就對(duì)其進(jìn)行調(diào)用:PrivateShared m_vb6FormDefInstance As Form1Public Shared Property DefInstance(As Form1GetIf m_vb6FormDefInstance Is Nothing OrElse_m_vb6FormDefInstance.IsDisposed Then判別窗體實(shí)例是不是存在m_vb6FormDefInstance=New Form1(End IfDefInstance=m_vb6FormDefInstanceEnd GetSet(ByVal Value As Form1m_

20、vb6FormDefInstance=ValueEnd SetEnd Property在Form2中也參加相似的代碼,只不過把Form1改為Form2 。調(diào)用它是如此的便利: /Form1中的代碼Private Sub Button1_Click(ByVal sender As System.Object,ByVal eAs System.EventArgsHandles Button1.ClickMe.Hide(End Sub/Form2中的代碼Private Sub Button1_Click(ByVal sender As_System.Object,ByVal e As System.

21、EventArgs_Handles Button1.ClickMe.Hide(End SubPrivate Sub Form2_Closing(ByVal sender As Object,_Handles MyBase.ClosingEnd Sub趕忙運(yùn)轉(zhuǎn)一下,不對(duì)呀,榜首個(gè)窗體里文本框改為“Henry的著作”后,再切換仍是不見了?我疑問地昂首看了看大李?!澳阍俸煤孟胂?首次發(fā)動(dòng)的是啥?”大李模糊地說了一句。“首次發(fā)動(dòng)的是作為主線程的Form1窗體呀!”我嘟啷著說?!澳敲碏orm1.DefInstance在哪呢?”大李這句話真是吵醒夢中人呀!我馬上著手:Module Module1Sub M

22、ain(Application.Run(Form1.DefInstanceEnd SubEnd Module并把Module1設(shè)為發(fā)動(dòng)項(xiàng)目。運(yùn)轉(zhuǎn)運(yùn)轉(zhuǎn)哈哈,一切都滿意!我開端喜愛上VB.NET了。VB.NET之旅(四類和布局剛上班,就被大李找去了。“Henry,昨日對(duì)窗體的操作給你最大的領(lǐng)會(huì)是啥?”“當(dāng)然有領(lǐng)會(huì),最深的形象即是VB.NET中類是無所不在了,連窗體都變成了一個(gè)類?!蔽疑钣懈惺艿卣f。“沒錯(cuò),類是咱們用來布局VB.NET應(yīng)用程序時(shí)的最基本的編程布局了。你也學(xué)習(xí)過最基本的面向目標(biāo)編程了,那么你能告訴我,布局與類有啥相似之處與不一樣之處嗎?”“好的。”我口中答復(fù)著,心里仍是有點(diǎn)不以為然,“

23、布局和類,都是對(duì)成員的封裝辦法,可是類能夠撐持承繼”大李一邊點(diǎn)著頭,一邊聽我說,聽到我結(jié)尾支吾著沒了聲響才抬起頭“還有呢?”“沒了?!蔽疫@時(shí)才開端心中發(fā)慌?!昂呛?一樣之處我想你心中仍是知道的,它們都富含成員,包括布局函數(shù)、辦法、特點(diǎn)、字段、常量、枚舉和工作。都可以完結(jié)接口,都有同享的布局函數(shù)?!薄皩?duì)不住,結(jié)尾那一句,都有布局函數(shù)是啥意思?布局的布局函數(shù)我從來沒有自個(gè)界說過?!贝罄铖R上寫下了這一段代碼:Structure SHenryPublic x,y As IntegerPublic Sub New(ByVal x As Integer,ByVal y As IntegerMe.x=xMe

24、.y=yEnd SubEnd StructureSub main(Dim H1As SHenry=New SHenry(Dim H2As SHenry=New SHenry(2,1End Sub“真的呢,能夠完結(jié)布局的布局函數(shù)!”我還一向沒有注意過這個(gè)疑問?!翱墒?你只界說過一個(gè)帶參數(shù)的布局函數(shù),H2的實(shí)例化我是知道的,可是H1怎樣也能經(jīng)過編譯器檢測呢?”其實(shí)我心中更想問的是布局怎樣也能實(shí)例化成目標(biāo),那和類真的很象呀?!熬売擅?”大李推了推眼鏡,“每個(gè)布局都隱式地具有Public 無參數(shù)實(shí)例構(gòu)造函數(shù),該布局函數(shù)產(chǎn)生布局的默許值。所以你平常不寫布局函數(shù),也一樣能夠New出一個(gè)布局來,對(duì)吧?事實(shí)上

25、,咱們反而在布局類型聲明中不行能聲明無參數(shù)實(shí)例布局函數(shù)。只能聲明參數(shù)化實(shí)例布局函數(shù)?!薄岸寄軌蛴胣ew來實(shí)例化,布局和類在內(nèi)存分配上莫非也是一樣的嗎?”這個(gè)疑問我一向挺不知道,正巧借這個(gè)論題問一下?!霸谶@上面,不一樣可就大了。”看到大李滿面笑容的姿態(tài),我就曉得問到點(diǎn)子上了,馬上擺開姿勢,作仔細(xì)傾聽狀?!昂喡詠碚f,布局是值類型,而類是引證類型。因而,布局運(yùn)用倉庫分配,類運(yùn)用堆分配?!笨吹轿疑n茫的雙眼,大李笑了笑,在電腦上飛快地寫了個(gè)示例:Class CHenryPublic z As Integer=0能對(duì)非靜態(tài)成員初始化也是一個(gè)差異End ClassSub main(Dim H1As SHen

26、ry=New SHenry(0,2'賦給H1.x=0Dim H2As SHenry=H1H2.x=26Dim R1As New CHenry('R1.z也是等于0Dim R2As CHenry=R1R2.z=26Console.WriteLine("H1.x="&H1.x&",H2.x="&H2.xConsole.WriteLine("R1.z="&R1.z&",R2.value="&R2.zEnd Sub“你看一下成果大概是啥?”大李一邊說,一邊運(yùn)轉(zhuǎn)

27、了程序:H1.x=0,H2.x=26R1.z=26,R2.value=26 “這即是值類型和引證類型的不一樣。布局的實(shí)例H2.x 賦值并不影響H1.x ,這是由于盡管它們同歸于一種SHenry布局,但它們都有各自的存儲(chǔ)空間。相反,給R2.z賦值26后; 則會(huì)影響R1 和R2 都引證的目標(biāo)”“說得更知道一點(diǎn),類作為引證類型,是存儲(chǔ)在運(yùn)轉(zhuǎn)時(shí)的堆上,只能經(jīng)過引證該存儲(chǔ)來拜訪它們,不能直接拜訪。引證類型的變量總是包括該類型的值引證,或包括空引證??找C不引證任何內(nèi)容;除分配空引證外,對(duì)空引證進(jìn)行的任何操作都是無效的。引證類型的變量賦值只會(huì)創(chuàng)立引證的一個(gè)副本,而不是所引證的值的副本。它們實(shí)踐上都是會(huì)指向

28、同一塊存儲(chǔ)區(qū)的?!贝罄钍种噶酥高\(yùn)轉(zhuǎn)的成果?!安季质侵苯哟鎯?chǔ)在倉庫上,要么在數(shù)組中,要么在另一個(gè)類型中。當(dāng)包括布局實(shí)例的方位被毀掉時(shí),布局實(shí)例也會(huì)被毀掉。值類型總是能夠直接拜訪。咱們不能創(chuàng)立對(duì)值類型的引證,也不能引證已毀掉的值類型實(shí)例。值類型的變量總是包括此類型的值。與引證類型不一樣,值類型的值不能為空引證,也不能引證派生附近程度較大的類型的目標(biāo)。值類型的變量賦值會(huì)創(chuàng)立所賦的值的副本,當(dāng)然會(huì)新拓荒一塊內(nèi)存區(qū)來保管值?!薄芭?我知道了。它們還有啥差異沒有?”我對(duì)布局和類的差異首次有了深入的感受。“當(dāng)然有許多,比方一切的布局成員都默以為Public,類變量和常量默以為Private,其他的類成員默以

29、為Public;布局成員不能聲明為Protected,類成員能夠;布局進(jìn)程不能處置工作,類進(jìn)程能夠;結(jié)構(gòu)變量聲明不能指定初始值、New 關(guān)鍵詞或數(shù)組初始巨細(xì),類變量聲明能夠?!贝罄詈攘丝谒?停了一下,然后持續(xù)說?!安季謴牟煌V?所以公共言語運(yùn)行庫從不在任何布局上調(diào)用Finalize 辦法;類可由廢物收回器停止,廢物收回器會(huì)盯梢未完結(jié)的引證直到某個(gè)特定的實(shí)例,當(dāng)檢測到?jīng)]有剩余的活動(dòng)引證時(shí),廢物收回器將在類上調(diào)用Finalize?!薄斑@個(gè)我能夠知道,由于布局是值類型,是由系統(tǒng)統(tǒng)一辦理內(nèi)存,不是引證,所以不會(huì)對(duì)內(nèi)存形成危害?!蔽医又f了兩句?!斑€有,你方才也說到了它們之間一個(gè)很重要的差異:布局是不行

30、承繼的,而類能夠承繼。其實(shí)布局自身是從ValueType 類隱式承繼下來的。數(shù)據(jù)類型可分為值類型和引證類型。值類型要么是倉庫分配的,要么是在布局中以內(nèi)聯(lián)辦法分配的。引證類型是堆分配的。引證類型和值類型都是從結(jié)尾的基類Object 派生出來的。當(dāng)值類型需求充任目標(biāo)時(shí),就在堆上分配一個(gè)包裝,該包裝能使值類型看上去像引證目標(biāo)一樣,并且將該值類型的值仿制給它。該包裝被加上符號(hào),以便系統(tǒng)曉得它包括一個(gè)值類型。這個(gè)進(jìn)程稱為裝箱,其反向進(jìn)程稱為撤銷裝箱。裝箱和撤銷裝箱能夠使任何類型像目標(biāo)一樣進(jìn)行處置?!薄芭?我知道為啥布局也能被實(shí)例化成目標(biāo)了!”我心中喜不自禁?!邦惖某欣^我在用C+和Java時(shí)也常常運(yùn)用,可

31、是VB6是不撐持承繼的,前次您說到VB.NET能夠撐持承繼了,它是怎樣做到的呀!”VB.NET之旅(五類的承繼“類的承繼?”大李點(diǎn)答應(yīng),“從前許多人批判VB的功用不完善時(shí),都會(huì)加上這個(gè)條件??墒侨缃馰B.NET 中現(xiàn)已是比較完善的面向目標(biāo)編程辦法了。方才咱們也說到過,類與VB.NET 的布局相似,讓咱們能夠界說封裝一組有關(guān)項(xiàng)的數(shù)據(jù)類型。然而與布局的一個(gè)重要差異即是,VB.NET 類能夠承繼和擴(kuò)展其他類的特性。作為新類的根底的類稱為基類。從基類派生的類稱為派生類。派生類承繼基類中界說的一切字段、特點(diǎn)、辦法和工作。你看,咱們只需對(duì)類進(jìn)行一次開發(fā)和調(diào)試,就能夠?qū)⑵渥鳛槠渌惖幕A(chǔ)重復(fù)運(yùn)用?!薄邦惖某?/p>

32、繼的概念我學(xué)過的,在VB.NET中是如何來實(shí)踐演練呢?”我仍是堅(jiān)持著問?!拔覍懚未a給你看一下吧,俗語不是說,百聞不如一見嗎?”大李戲弄了兩句,噼噼啪啪地開端敲打起鍵盤來:Public Class CBaseHenryPrivate x As Integer=10Protected y As IntegerSub New(Console.WriteLine("基類的布局"End SubProtected Overrides Sub Finalize(Console.WriteLine("基類的析構(gòu)"MyBase.Finalize(End SubPubli

33、c Overridable Function GetY(ByVal x As IntegerAs IntegerMe.y=me.x+xprivate類型的me.x只能在基類中運(yùn)用Console.WriteLine("基類的GetY辦法,成果為:"&Me.yReturn Me.yEnd FunctionPublic Sub OldY(Console.WriteLine("基類的OldY辦法"End SubEnd Class“你看,這是一個(gè)基類,我再給你寫個(gè)承繼自該類的派生類。”他一邊說一邊持續(xù)寫: Public ClassCDerivedHenry

34、Inherits CBaseHenrySub New(MyBase.New(注意:這句話要放在sub內(nèi)的榜首句Console.WriteLine("派生類的布局"End SubProtected Overrides Sub Finalize(Console.WriteLine("派生類的析構(gòu)"MyBase.Finalize(End SubPublic Overrides Function GetY(ByVal x As IntegerAsIntegerMe.y=x*10protected類型的me.y卻能夠在派生類中使用Console.WriteLine

35、("派生類的GetY辦法,成果為:"&Me.yReturn Me.yEnd FunctionPublic Sub NewY(Console.WriteLine("派生類的新辦法"End SubEnd Class“你看清了吧,咱們經(jīng)過聲明Inherits關(guān)鍵詞,來標(biāo)識(shí)該類的基類是誰,若是沒有標(biāo)識(shí)的類,比方CBaseHenry,VB.Net就會(huì)視其為派生自O(shè)bject基類,這是種隱式承繼,和布局是隱式承繼自ValueType 類的辦法是一樣的?!贝罄钪钢聊桓艺f明著?!澳沁@些overrides與overload標(biāo)識(shí)是啥意思呀?”我隱約感受到它們的含

36、義,卻無法知道地說出來?!霸蹅冞\(yùn)用承繼,也要答應(yīng)派生類中的某些特點(diǎn)或辦法有與基類不一樣的行動(dòng),咱們想重寫它,但基類也得要附和你才干重寫呀,不然不就會(huì)發(fā)作命名抵觸了嗎?由于派生類的目標(biāo)是能夠運(yùn)用基類的共用成員的,那怎樣曉得哪些基類的辦法與特點(diǎn)是被派生類重寫了呢?所以就有必要有一個(gè)約好:咱們在基類頂用Overridable潤飾符來標(biāo)識(shí)答應(yīng)基類中的特點(diǎn)或辦法在其派生類中被重寫,沒有標(biāo)識(shí)的其實(shí)即是默以為有NotOverridable潤飾符來隱式地標(biāo)識(shí),用于提示編譯器該特點(diǎn)或辦法不行被重寫;然后在派生類重寫時(shí),咱們就用Overrides潤飾符來標(biāo)識(shí)哪些是重寫自基類中界說的Overridable 特點(diǎn)或辦

37、法。”大李娓娓道來,“咱們來演練一下對(duì)派生類的操作吧。”Public Sub Main(Dim obj As CDerivedHenry=New CDerivedHenry(obj.GetY(4'調(diào)用派生類的GetY辦法obj.OldY('調(diào)用基類的oldY辦法obj.NewY('調(diào)用派生類的NewY辦法End Sub然后大李按了一下F5鍵,在“輸出”窗口中就呈現(xiàn)了如下的運(yùn)轉(zhuǎn)成果:基類的布局開始運(yùn)轉(zhuǎn)New CDerivedHenry(派生類的布局派生類的GetY辦法,成果為:40obj.GetY(4的運(yùn)轉(zhuǎn)成果=4*10,不等于基類的(4+10基類的OldY辦法obj.O

38、ldY(的運(yùn)轉(zhuǎn)成果派生類的新辦法obj.NewY(的運(yùn)轉(zhuǎn)成果派生類的析構(gòu)基類的析構(gòu)“你看,你只在Main中實(shí)例化了一個(gè)派生類的對(duì)象,為啥先會(huì)呈現(xiàn)基類的布局?”大李問?!斑@個(gè)么,”我開端在代碼中檢查起來,“是這句了?!蔽沂种钢缮惱锏倪@段代碼:Sub New(MyBase.New(注意:這句話要放在sub內(nèi)的榜首句Console.WriteLine("派生類的布局"End Sub“沒錯(cuò),咱們有必要要注意這一點(diǎn),即是派生類的布局函數(shù)與析構(gòu)函數(shù)都有必要從頭編寫。New 布局函數(shù)通常用于翻開文件、銜接到數(shù)據(jù)庫、初始化變量以及處置任何需求在可運(yùn)用目標(biāo)前完結(jié)的其他使命。咱們有必要在Sub New 布局函數(shù)中的榜首行代碼運(yùn)用句子MyBase.New(,來調(diào)用類層次布局中該類的基類的布局函數(shù),以取得基類的性質(zhì)。析構(gòu)則是在Sub Finalize中履行完對(duì)派生類的的整理使命,如保管狀況信息、封閉文件和與數(shù)據(jù)庫的銜接,以及履行在開釋目標(biāo)前有必要完結(jié)的其他使命之后,在析構(gòu)函數(shù)的結(jié)尾一句運(yùn)用句子MyBase.Finalize( 顯式調(diào)用其基類的Sub Finalize 辦法,以析構(gòu)MyBase.New (布

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論