文章目錄
組件的初始化和終止
組件由其建構函式(在 Visual Basic 中為 SubNew)初始化,由其解構函式(在 Visual Basic 中為 SubFinalize)銷毀。當建立組件的執行個體時調用組件的建構函式;之後不能再調用此建構函式。在記憶體回收銷毀組件並回收其記憶體之前調用解構函式。
| Visual Basic 注意 |
在以前版本的 Visual Basic 中,Initialize 和 Terminate 事件起到與建構函式和解構函式相同的作用。 |
等待記憶體回收
當記憶體回收確定組件不能再由任何執行代碼訪問後,公用語言運行庫將調用該組件的解構函式。如果對組件的所有引用都已釋放,或者對組件的唯一引用由特定的對象保持,而該對象以同樣的方式與所有執行代碼隔離(例如循環參考的情況),則將發生上述情況。
鑒於使用者使用完組件與調用組件的解構函式之間可能有一個延遲,在 .NET Framework 組件的生存期中另外引入了一步:如果組件擷取系統資源(如資料庫連接或 Windows 系統對象的控制代碼),則應實現 IDisposable 介面,並提供 Dispose 方法以便組件的使用者可以選擇何時釋放那些資源。
組件的生存期
類型初始化:當建立組件的第一個執行個體時,執行的第一個代碼是任何共用的初始化代碼。對任何共用成員的引用都將導致執行共用建構函式。這包括任何初始化的共用欄位(成員變數)和可能存在的共用建構函式 (SharedSubNew)。在下列代碼中,為整個類建立了引用字型。
| 注意 |
與 Shared 相對應的 C# 關鍵字是 static,這是為了不與 Visual Basic 中的 Static 關鍵字混淆。 |
何時應實現 Dispose 方法?
如果組件從 Component 繼承,系統會提供 Dispose 的預設實現。可重寫此實現以提供自訂清理代碼。如果通過建立 IComponent 的自訂實現產生組件,則應實現 IDisposable 以便為組件提供 Dispose 方法。
如果組件分配了系統對象、資料庫連接或其他應在使用者使用完組件後立即釋放的短缺資源,則組件需要 Dispose 方法。
如果組件有對其他對象的引用,而那些對象具有 Dispose 方法,則也應實現 Dispose 方法。
為什麼實現 Dispose?
根據系統活動的不同,在使用者使用完組件和記憶體回收檢測到組件的代碼不可訪問之間的時間間隔可能不可預知。如果未提供 Dispose 方法,則在這段間隔期內,組件將一直控制其資源。
最壞情況的方案
設想一下使用資料庫連接卻沒有 Dispose 方法的伺服器組件。在有大量記憶體的伺服器上,您可能建立並釋放組件的許多執行個體,而不會對可用記憶體有太大影響。在此情況下,當釋放了對組件的引用後,記憶體回收可能在一段時間內不銷毀組件。
最後,所有可用的資料庫連接可能都被已釋放但尚未銷毀的組件佔用了。即使伺服器的記憶體夠用,它也可能無法響應使用者請求。