點擊查看:2018計算機軟考《系統(tǒng)架構(gòu)設(shè)計師》復習資料匯總
管理可用資源
公共語言運行庫 (CLR) 使用垃圾回收器來管理對象生存期和內(nèi)存使用。這意味著無法再訪問的對象將被垃圾回收器自動回收,并且自動回收內(nèi)存。由于多種原因無法再訪問對象。例如,可 能沒有對該對象的任何引用,或者對該對象的所有引用可能來自其他可作為當前回收周期的一部分進行回收的對象。盡管自動垃圾回收使您的代碼不必負責管理對象 刪除,但這意味著您的代碼不再對對象的確切刪除時間具有顯式控制。請考慮下列原則,以確保您能夠有效地管理可用資源:
1)確保在被調(diào)用方對象提供 Dispose 方法時該方法得到調(diào)用。如果您的代碼調(diào)用了支持Dispose 方法的對象,則您應(yīng)該確保在使用完該對象之后立即調(diào)用此方法。調(diào)用 Dispose 方法可以確保搶先釋放非托管資源,而不是等到發(fā)生垃圾回收。除了提供 Dispose 方法以外,某些對象還提供其他管理資源的方法,例如,Close 方法。在這些情況下,您應(yīng)該參考文檔資料以了解如何使用其他方法。例如,對于 SqlConnection 對象而言,調(diào)用 Close 或 Dispose 都足可以搶先將數(shù)據(jù)庫連接釋放回連接池中。一種可以確保您在對象使用完畢之后立即調(diào)用 Dispose 的方法是使用 Visual C# .NET 中的 using 語句或 Visual Basic .NET 中的Try/Finally 塊。 下面的代碼片段演示了 Dispose 的用法。
C# 中的 using 語句示例:
using( StreamReader myFile = new StreamReader("C:\\ReadMe.Txt")){
string contents = myFile.ReadToEnd();
//... use the contents of the file
} // dispose is called and the StreamReader’s resources released
Visual Basic .NET 中的 Try/Finally 塊示例:
Dim myFile As StreamReader
myFile = New StreamReader("C:\\ReadMe.Txt")
Try
String contents = myFile.ReadToEnd()
’... use the contents of the file
Finally
myFile.Close()
End Try 注:在 C# 和 C++ 中,F(xiàn)inalize 方法是作為析構(gòu)函數(shù)實現(xiàn)的。在 Visual Basic .NET 中,F(xiàn)inalize 方法是作為 Object 基類上的 Finalize 子例程的重寫實現(xiàn)的。
2)如果您在客戶端調(diào)用過程中占據(jù)非托管資源,則請?zhí)峁?Finalize 和 Dispose 方法。如果您在公共或受保護的方法調(diào)用中創(chuàng)建訪問非托管資源的對象,則應(yīng)用程序需要控制非托管資源的生存期。在圖 8.1 中,第一種情況是對非托管資源的調(diào)用,在此將打開、獲取和關(guān)閉資源。在此情況下,您的對象無須提供 Finalize 和 Dispose 方法。在第二種情況下,在方法調(diào)用過程中占據(jù)非托管資源;因此,您的對象應(yīng)該提供 Finalize 和 Dispose 方法,以便客戶端在使用完該對象后可以立即顯式釋放資源。
垃圾回收通常有利于提高總體性能,因為它將速度的重要性置于內(nèi)存利用率之上。只有當內(nèi)存資源不足時,才需要刪除對象;否則,將使用所有可用的應(yīng)用程序資源以 使您的應(yīng)用程序受益。但是,如果您的對象保持對非托管資源(例如,窗口句柄、文件、GDI 對象和網(wǎng)絡(luò)連接)的引用,則程序員通過在這些資源不再使用時顯式釋放它們可以獲得更好的性能。如果您要在客戶端方法調(diào)用過程中占據(jù)非托管資源,則對象應(yīng)該 允許調(diào)用方使用IDisposable 接口(它提供 Dispose 方法)顯式管理資源。通過實現(xiàn) IDisposable,對象將通知它可被要求明確進行清理,而不是等待垃圾回收。實現(xiàn) IDisposable 的對象的調(diào)用方在使用完該對象后將簡單地調(diào)用 Dispose 方法,以便它可以根據(jù)需要釋放資源。注如果您的可處置對象派生自另一個也實現(xiàn)了 IDisposable 接口的對象,則您應(yīng)該調(diào)用基類的 Dispose 方法以使其可以清理它的資源。您還應(yīng)該調(diào)用實現(xiàn)了 IDisposable 接口的對象所擁有的所有對象上的 Dispose。Finalize 方法也使您的對象可以在刪除時顯式釋放其引用的任何資源。由于垃圾回收器所具有的非確定性,在某些情況下,F(xiàn)inalize 方法可能長時間不會被調(diào)用。實際上,如果您的應(yīng)用程序在垃圾回收器刪除對象之前終止,則該方法可能永遠不會被調(diào)用。然而,需要使用Finalize 方法作為一種后備策略,以防調(diào)用方?jīng)]有顯式調(diào)用 Dispose 方法(Dispose 和 Finalize 方法共享相同的資源清理代碼)。通過這種方式,可能在某個時刻釋放資源,即使這發(fā)生在最佳時刻之后。注要確保 Dispose 和 Finalize 中的清理代碼不會被調(diào)用兩次,您應(yīng)該調(diào)用GC.SuppressFinalize 以通知垃圾回收器不要調(diào)用 Finalize 方法。垃圾回收器實現(xiàn)了 Collect 方法,該方法強制垃圾回收器刪除所有對象掛起刪除。不應(yīng)該從應(yīng)用程序內(nèi)調(diào)用該方法,因為回收周期在高優(yōu)先級線程上運行;厥罩芷诳赡軆鼋Y(jié)所有 UI 線程,從而使得用戶界面停止響應(yīng)。
相關(guān)推薦:
北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |