快速了解VB.NET垃圾收集器
VB.NET還是比較常用的,于是我研究了一下VB.NET垃圾收集器,在這里拿出來(lái)和大家分享一下,希望對(duì)大家有用。每當(dāng)創(chuàng)建類的實(shí)例時(shí),如果該對(duì)象中存在名為 New 的過(guò)程,則公共語(yǔ)言運(yùn)行庫(kù) (CLR) 嘗試執(zhí)行它。New 是一種稱為“構(gòu)造函數(shù)”的過(guò)程,該構(gòu)造函數(shù)用于在對(duì)象中的任何其他代碼執(zhí)行之前初始化新對(duì)象。New 構(gòu)造函數(shù)可用于打開(kāi)文件、連接到數(shù)據(jù)庫(kù)、初始化變量以及處理任何需要在可使用對(duì)象前完成的其他任務(wù)。
當(dāng)創(chuàng)建派生類的實(shí)例時(shí),基類的 Sub New 構(gòu)造函數(shù)首先執(zhí)行,然后執(zhí)行派生類中的構(gòu)造函數(shù)。這是因?yàn)?Sub New 構(gòu)造函數(shù)中的第一行代碼使用語(yǔ)法 MyBase.New() 調(diào)用類層次結(jié)構(gòu)中該類本身緊上面的類的構(gòu)造函數(shù)。然后調(diào)用該類層次結(jié)構(gòu)中每個(gè)類的 Sub New 構(gòu)造函數(shù),直到到達(dá)基類的構(gòu)造函數(shù)。此時(shí),基類構(gòu)造函數(shù)中的代碼執(zhí)行,接著執(zhí)行所有派生類中每個(gè)構(gòu)造函數(shù)的代碼,最后執(zhí)行最相近派生的類中的代碼。
當(dāng)不再需要某對(duì)象時(shí),CLR 調(diào)用該對(duì)象的 Finalize 方法,然后釋放其內(nèi)存。Finalize 方法稱為“析構(gòu)函數(shù)”,因?yàn)樗鼒?zhí)行清理任務(wù),如保存狀態(tài)信息、關(guān)閉文件和與數(shù)據(jù)庫(kù)的連接,以及執(zhí)行在釋放對(duì)象前必須完成的其他任務(wù)。
當(dāng)調(diào)用派生類的 Sub Finalize 方法時(shí),首先執(zhí)行所需的任何清理任務(wù),然后使用語(yǔ)法 MyBase.Finalize() 顯式調(diào)用其基類的 Sub Finalize 方法。因此,Sub Finalize 方法首先從最相近派生的類開(kāi)始運(yùn)行,最后執(zhí)行基類中的代碼。
一旦涉及到finalize方法,垃圾收集器就不能不提到,在.net環(huán)境中,由垃圾收集器來(lái)管理內(nèi)存,在VB.NET垃圾收集器告訴你的程序不在需要使用某個(gè)對(duì)象的方法是把對(duì)象設(shè)置為nothing,如下:
- employee=nothing
在VB.NET垃圾收集器釋放某個(gè)對(duì)象之前,首先調(diào)用該對(duì)象的finalize方法,根據(jù)處理的不同,有時(shí)從程序中止使用某個(gè)對(duì)象到某個(gè)對(duì)象的finalize方法運(yùn)行之間時(shí)間很長(zhǎng),在這種情況下可以在類里放一個(gè)dispose的專門方法,用這個(gè)方法執(zhí)行對(duì)廢棄對(duì)象的處理,當(dāng)某個(gè)對(duì)象的內(nèi)容不需要使用時(shí),調(diào)用 dispose方法,程序立即執(zhí)行對(duì)象的清理處理,仔細(xì)觀察vs生成的窗口代碼,也會(huì)發(fā)現(xiàn)dispose方法的代碼,如下:
- Public Sub New()
- MyBase.New()
- '該調(diào)用是 Windows 窗體設(shè)計(jì)器所必需的。
- InitializeComponent()
- '在 InitializeComponent() 調(diào)用之后添加任何初始化
- End Sub
- '窗體重寫(xiě) dispose 以清理組件列表。
- Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
- If disposing Then
- If Not (components Is Nothing) Then
- components.Dispose()
- End If
- End If
- MyBase.Dispose(disposing)
- End Sub
我們只需要把dispose進(jìn)行調(diào)用就可以了:someclass.dispose
【編輯推薦】