小編給大家分享一下VB6和VB.NET在創(chuàng)建類和VB.NET對(duì)象的有什么變化,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
創(chuàng)新互聯(lián)基于成都重慶香港及美國(guó)等地區(qū)分布式IDC機(jī)房數(shù)據(jù)中心構(gòu)建的電信大帶寬,聯(lián)通大帶寬,移動(dòng)大帶寬,多線BGP大帶寬租用,是為眾多客戶提供專業(yè)四川雅安電信機(jī)房報(bào)價(jià),主機(jī)托管價(jià)格性價(jià)比高,為金融證券行業(yè)服務(wù)器托管,ai人工智能服務(wù)器托管提供bgp線路100M獨(dú)享,G口帶寬及機(jī)柜租用的專業(yè)成都idc公司。
VB.NET對(duì)象的終止
在VB6中對(duì)象是在***引用移除后被終止的。換成另外一句話說(shuō),當(dāng)沒(méi)有其它代碼引用這個(gè)對(duì)象的時(shí)候,這個(gè)對(duì)象將自動(dòng)終止。具體觸發(fā)這個(gè)終止事件的是Class_Terminate。這種方法是使用引用計(jì)數(shù)來(lái)決定對(duì)象是否被終止的,是VB的一個(gè)直接的產(chǎn)品,它跟COM有緊密的聯(lián)系。
所以我們?cè)谛枰K止這個(gè)對(duì)象的使用就調(diào)用Class_Terminate事件,使得很容易控制對(duì)象。但是它也有不足之處。很明顯地,雖然在兩個(gè)對(duì)象之間創(chuàng)建循環(huán)引用是很容易,但是它們將在內(nèi)存中永遠(yuǎn)地被運(yùn)行。這正是在VB6中其中一種導(dǎo)致內(nèi)存泄漏的缺陷。
這個(gè)內(nèi)存泄漏問(wèn)題在VB6以前的版本中是無(wú)法克服的。在VB6中,循環(huán)引用只發(fā)生在不同組件上。在VB6中,由相同的組件中的類創(chuàng)建而來(lái)的類將被自動(dòng)終止,即使它們有循環(huán)引用。但是,如果對(duì)象來(lái)自不同的組件,循環(huán)引用問(wèn)題就依然存在。這個(gè)是個(gè)很大的問(wèn)題,它給許多VB開發(fā)人員帶來(lái)了麻煩。所以,在VB6中程序不得不尋求各種方法來(lái)終止對(duì)象。
不象COM,.NET不是使用引用計(jì)數(shù)來(lái)決定對(duì)象是否被終止的。取而代之的是,它使用了一個(gè)有名的“垃圾收集”方案來(lái)終止對(duì)象。可能聽(tīng)到“垃圾收集”方案,您會(huì)云里霧里的,它的意思實(shí)際上是在VB.NET中我們不用預(yù)先定一個(gè)對(duì)象的終止方案,因此我們就不能準(zhǔn)確地預(yù)測(cè)對(duì)象什么時(shí)候被終止的。下面我們?cè)敿?xì)探討一下“垃圾收集”。 “垃圾收集”
在.NET中,引用計(jì)數(shù)不是一個(gè)基礎(chǔ)功能部分。相反地,對(duì)象是通過(guò)一個(gè)“垃圾收集”機(jī)理被終止。在某特定的時(shí)間(這決定特殊的規(guī)則),一個(gè)任務(wù)會(huì)在所有的對(duì)象中運(yùn)行來(lái)查找哪些已經(jīng)沒(méi)有被引用的VB.NET對(duì)象,并且將這些對(duì)象終止,即所謂的“垃圾收集”,名字是有點(diǎn)土,但更形象化。
由以上的討論我們可以知道,我們不能很準(zhǔn)確地知道對(duì)象是在什么時(shí)候被終止的。我們除去對(duì)象的所有引用之后,并不是意味著對(duì)象快速地被終止了。此時(shí)對(duì)象還存在于內(nèi)存中,直到垃圾收集處理程序運(yùn)行之后才將它從內(nèi)存中清除。
垃圾收集的主要好處是它清除了由引用計(jì)數(shù)帶來(lái)的循環(huán)應(yīng)用問(wèn)題。如果兩個(gè)對(duì)象互相有引用,并且在程序中沒(méi)有其它互相引用的代碼時(shí),垃圾收集程序就會(huì)發(fā)現(xiàn)它們并將它們終止。這一點(diǎn)在COM中是不可能做到的,因?yàn)樗鼈儗⒃趦?nèi)存中永遠(yuǎn)存在。
垃圾收集還有另外一個(gè)潛在的性能優(yōu)點(diǎn):在VB.NET對(duì)象被取消引用的時(shí)候不用花很多的精力在終止對(duì)象上;利用了垃圾收集,這個(gè)終止處理過(guò)程是在應(yīng)用程序處于空閑狀態(tài)發(fā)生的,所以它減輕了對(duì)用戶的影響。但是,垃圾收集也會(huì)發(fā)生在應(yīng)用程序處在運(yùn)行裝載的時(shí)候,這時(shí)候系統(tǒng)將會(huì)運(yùn)行在較低的系統(tǒng)資源下。
另外,我們可以通過(guò)編寫代碼來(lái)手動(dòng)觸發(fā)垃圾收集處理程序:
System.GC.Collect()
以上這個(gè)處理過(guò)程要花一些時(shí)間,但是我們?cè)谙虢K止對(duì)象的時(shí)候也不必每次都執(zhí)行這個(gè)處理過(guò)程。我們***是這樣來(lái)設(shè)計(jì)我們的應(yīng)用程序:在***終止對(duì)象的時(shí)候才將對(duì)象從內(nèi)存在清除。
Finalize方法
這個(gè)垃圾收集機(jī)理提供了一些功能,這些功能可以跟VB6中的Class_Terminate事件相媲美。當(dāng)VB.NET對(duì)象被終止的時(shí)候,垃圾收集處理的代碼將調(diào)用Finalize方法,它就象Class_Terminate一樣可以進(jìn)行一些***的內(nèi)存清理工作。
Protected Overrides
Sub Finalize()(此處可以進(jìn)行一些內(nèi)存清理工作)
End Sub
以上的這些代碼可以使用Protected(保護(hù))作用域也可以使用重載關(guān)鍵字。這里值得指出的是,這種方法是在對(duì)象被垃圾收集機(jī)理終止之前被調(diào)用的,所以它跟Class_Terminate很是相似。
但是,我們還需要記得這種方法可以在對(duì)象被取消引用后被調(diào)用,它是通過(guò)***一段客戶代碼來(lái)實(shí)現(xiàn)的。
實(shí)現(xiàn)Dispose方法
在有些場(chǎng)合中Finalize方法是不可接收的。如果我們有一個(gè)VB.NET對(duì)象,它是使用一些非常有限的寶貴的系統(tǒng)資源,比如數(shù)據(jù)庫(kù)連接、文件處理或者系統(tǒng)鎖住等等。這時(shí)候我們就需要確保系統(tǒng)資源在對(duì)象被取消引用的時(shí)候是否被釋放。
為了實(shí)現(xiàn)這個(gè)目的,我們可以執(zhí)行這樣一個(gè)方法,它可以被客戶代碼調(diào)用來(lái)強(qiáng)迫對(duì)象被清除并且釋放系統(tǒng)資源。雖然這不是一個(gè)很好的解決方案,但是它確實(shí)是很有效的。習(xí)慣上,這個(gè)方法就取名為Dispose,其代碼如下:
Public Sub Dispose() (此處可以進(jìn)行一些清除工作) End Sub
在必要的時(shí)候,我們可以調(diào)用這個(gè)方法來(lái)確保內(nèi)存清除工作的進(jìn)行。
以上是“VB6和VB.NET在創(chuàng)建類和VB.NET對(duì)象的有什么變化”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
新聞名稱:VB6和VB.NET在創(chuàng)建類和VB.NET對(duì)象的有什么變化
標(biāo)題鏈接:http://www.rwnh.cn/article28/gcgscp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動(dòng)網(wǎng)站建設(shè)、網(wǎng)站建設(shè)、云服務(wù)器、商城網(wǎng)站、面包屑導(dǎo)航、小程序開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)