偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

讓你了解VB.NET對象原理

開發(fā) 后端
這里介紹了VB.NET對象通過一個(gè)“垃圾收集”機(jī)理被終止還有對Finalize方法、實(shí)現(xiàn)Dispose方法都做出了詳細(xì)的解釋說明。

在網(wǎng)上收集了一些資料現(xiàn)在和大家一起討論一下,我們都知道VB.NET對象是在***引用移除后被終止的。當(dāng)沒有其它代碼引用這個(gè)對象的時(shí)候,這個(gè)VB.NET對象將自動(dòng)終止。終止事件的是Class_Terminate這種方法是使用引用計(jì)數(shù)來決定對象是否被終止的,是VB的一個(gè)直接的產(chǎn)品,它跟COM有緊密的聯(lián)系。

#T#所以我們在需要終止這個(gè)對象的使用就調(diào)用Class_Terminate事件,使得很容易控制對象。但是它也有不足之處。很明顯地,雖然在兩個(gè)對象之間創(chuàng)建循環(huán)引用是很容易,但是它們將在內(nèi)存中永遠(yuǎn)地被運(yùn)行。這正是在VB6中其中一種導(dǎo)致內(nèi)存泄漏的缺陷。這個(gè)內(nèi)存泄漏問題在VB6以前的版本中是無法克服的。在VB6中,循環(huán)引用只發(fā)生在不同組件上。在VB6中,由相同的組件中的類創(chuàng)建而來的類將被自動(dòng)終止,即使它們有循環(huán)引用。但是,如果對象來自不同的組件,循環(huán)引用問題就依然存在。這個(gè)是個(gè)很大的問題,它給許多VB開發(fā)人員帶來了麻煩。所以,在VB6中程序不得不尋求各種方法來終止VB.NET對象。

不象COM,.NET不是使用引用計(jì)數(shù)來決定對象是否被終止的。取而代之的是,它使用了一個(gè)有名的“垃圾收集”方案來終止對象。可能聽到“垃圾收集”方案,您會(huì)云里霧里的,它的意思實(shí)際上是在VB.NET中我們不用預(yù)先定一個(gè)對象的終止方案,因此我們就不能準(zhǔn)確地預(yù)測對象什么時(shí)候被終止的。下面我們詳細(xì)探討一下“垃圾收集”。 “垃圾收集”

在.NET中,引用計(jì)數(shù)不是一個(gè)基礎(chǔ)功能部分。相反地,對象是通過一個(gè)“垃圾收集”機(jī)理被終止。在某特定的時(shí)間(這決定特殊的規(guī)則),一個(gè)任務(wù)會(huì)在所有的對象中運(yùn)行來查找哪些已經(jīng)沒有被引用的對象,并且將這些對象終止,即所謂的“垃圾收集”,名字是有點(diǎn)土,但更形象化。由以上的討論我們可以知道,我們不能很準(zhǔn)確地知道對象是在什么時(shí)候被終止的。我們除去對象的所有引用之后,并不是意味著對象快速地被終止了。此時(shí)對象還存在于內(nèi)存中,直到垃圾收集處理程序運(yùn)行之后才將它從內(nèi)存中清除。

垃圾收集的主要好處是它清除了由引用計(jì)數(shù)帶來的循環(huán)應(yīng)用問題。如果兩個(gè)對象互相有引用,并且在程序中沒有其它互相引用的代碼時(shí),垃圾收集程序就會(huì)發(fā)現(xiàn)它們并將它們終止。這一點(diǎn)在COM中是不可能做到的,因?yàn)樗鼈儗⒃趦?nèi)存中永遠(yuǎn)存在。垃圾收集還有另外一個(gè)潛在的性能優(yōu)點(diǎn):在對象被取消引用的時(shí)候不用花很多的精力在終止對象上;利用了垃圾收集,這個(gè)終止處理過程是在應(yīng)用程序處于空閑狀態(tài)發(fā)生的,所以它減輕了對用戶的影響。但是,垃圾收集也會(huì)發(fā)生在應(yīng)用程序處在運(yùn)行裝載的時(shí)候,這時(shí)候系統(tǒng)將會(huì)運(yùn)行在較低的系統(tǒng)資源下。

另外,我們可以通過編寫代碼來手動(dòng)觸發(fā)垃圾收集處理程序:

  1. System.GC.Collect() 

以上這個(gè)處理過程要花一些時(shí)間,但是我們在想終止對象的時(shí)候也不必每次都執(zhí)行這個(gè)處理過程。我們***是這樣來設(shè)計(jì)我們的應(yīng)用程序:在***終止對象的時(shí)候才將對象從內(nèi)存在清除。

Finalize方法

這個(gè)垃圾收集機(jī)理提供了一些功能,這些功能可以跟VB6中的Class_Terminate事件相媲美。當(dāng)對象被終止的時(shí)候,垃圾收集處理的代碼將調(diào)用Finalize方法,它就象Class_Terminate一樣可以進(jìn)行一些***的內(nèi)存清理工作。

  1. Protected Overrides Sub Finalize()  
  2. (此處可以進(jìn)行一些內(nèi)存清理工作)  
  3. End Sub 

以上的這些代碼可以使用Protected(保護(hù))作用域也可以使用重載關(guān)鍵字。這里值得指出的是,這種方法是在對象被垃圾收集機(jī)理終止之前被調(diào)用的,所以它跟Class_Terminate很是相似。
但是,我們還需要記得這種方法可以在對象被取消引用后被調(diào)用,它是通過***一段客戶代碼來實(shí)現(xiàn)的。

實(shí)現(xiàn)Dispose方法

在有些場合中Finalize方法是不可接收的。如果我們有一個(gè)對象,它是使用一些非常有限的寶貴的系統(tǒng)資源,比如數(shù)據(jù)庫連接、文件處理或者系統(tǒng)鎖住等等。這時(shí)候我們就需要確保系統(tǒng)資源在對象被取消引用的時(shí)候是否被釋放。 為了實(shí)現(xiàn)這個(gè)目的,我們可以執(zhí)行這樣一個(gè)方法,它可以被客戶代碼調(diào)用來強(qiáng)迫對象被清除并且釋放系統(tǒng)資源。雖然這不是一個(gè)很好的解決方案,但是它確實(shí)是很有效的。習(xí)慣上,這個(gè)方法就取名為Dispose,其代碼如下:

  1. Public Sub Dispose()  
  2. (此處可以進(jìn)行一些清除工作)  
  3. End Sub 

在必要的時(shí)候,我們可以調(diào)用這個(gè)方法來確保內(nèi)存清除工作的進(jìn)行。從上面的討論中,我們可以深刻地體會(huì)倒VB6和VB.NET在創(chuàng)建類和對象的一些變化。下一個(gè)教程我們將詳細(xì)討論一下對象的繼承。

責(zé)任編輯:田樹 來源: 博客
相關(guān)推薦

2009-11-03 13:54:55

VB.NET繼承

2009-11-02 17:24:57

VB.NET語言

2009-11-02 10:42:04

VB.NET EXCE

2009-11-02 09:43:01

VB.NET構(gòu)造函數(shù)

2009-11-02 16:22:16

VB.NET面向?qū)ο?/a>

2009-11-03 13:33:39

VB.NET對象列表

2009-10-23 11:33:52

VB.NET集成開發(fā)環(huán)

2009-10-27 09:17:26

VB.NET生成靜態(tài)頁

2009-10-20 17:38:20

VB.NET exce

2009-11-10 16:27:45

VB.NET指針

2009-11-03 10:30:47

VB.NET繼承

2009-10-28 11:13:39

VB.NET虛擬框架

2009-10-30 13:31:06

VB.NET名空間

2009-10-29 14:04:48

VB.NET Deri

2009-10-28 13:23:52

VB.NET可選參數(shù)

2009-10-09 15:59:41

VB.NET對象

2009-10-14 13:21:46

VB.NET Acco

2009-10-29 15:50:49

VB.NET Exce

2009-10-29 14:22:59

VB.NET集合存儲

2009-10-27 18:06:41

VB.NET開發(fā)控件
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號