點(diǎn)擊查看:2018計(jì)算機(jī)軟考《系統(tǒng)架構(gòu)設(shè)計(jì)師》復(fù)習(xí)資料匯總
管理可用資源
公共語言運(yùn)行庫 (CLR) 使用垃圾回收器來管理對(duì)象生存期和內(nèi)存使用。這意味著無法再訪問的對(duì)象將被垃圾回收器自動(dòng)回收,并且自動(dòng)回收內(nèi)存。由于多種原因無法再訪問對(duì)象。例如,可 能沒有對(duì)該對(duì)象的任何引用,或者對(duì)該對(duì)象的所有引用可能來自其他可作為當(dāng)前回收周期的一部分進(jìn)行回收的對(duì)象。盡管自動(dòng)垃圾回收使您的代碼不必負(fù)責(zé)管理對(duì)象 刪除,但這意味著您的代碼不再對(duì)對(duì)象的確切刪除時(shí)間具有顯式控制。請(qǐng)考慮下列原則,以確保您能夠有效地管理可用資源:
1)確保在被調(diào)用方對(duì)象提供 Dispose 方法時(shí)該方法得到調(diào)用。如果您的代碼調(diào)用了支持Dispose 方法的對(duì)象,則您應(yīng)該確保在使用完該對(duì)象之后立即調(diào)用此方法。調(diào)用 Dispose 方法可以確保搶先釋放非托管資源,而不是等到發(fā)生垃圾回收。除了提供 Dispose 方法以外,某些對(duì)象還提供其他管理資源的方法,例如,Close 方法。在這些情況下,您應(yīng)該參考文檔資料以了解如何使用其他方法。例如,對(duì)于 SqlConnection 對(duì)象而言,調(diào)用 Close 或 Dispose 都足可以搶先將數(shù)據(jù)庫連接釋放回連接池中。一種可以確保您在對(duì)象使用完畢之后立即調(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ù)實(shí)現(xiàn)的。在 Visual Basic .NET 中,F(xiàn)inalize 方法是作為 Object 基類上的 Finalize 子例程的重寫實(shí)現(xiàn)的。
2)如果您在客戶端調(diào)用過程中占據(jù)非托管資源,則請(qǐng)?zhí)峁?Finalize 和 Dispose 方法。如果您在公共或受保護(hù)的方法調(diào)用中創(chuàng)建訪問非托管資源的對(duì)象,則應(yīng)用程序需要控制非托管資源的生存期。在圖 8.1 中,第一種情況是對(duì)非托管資源的調(diào)用,在此將打開、獲取和關(guān)閉資源。在此情況下,您的對(duì)象無須提供 Finalize 和 Dispose 方法。在第二種情況下,在方法調(diào)用過程中占據(jù)非托管資源;因此,您的對(duì)象應(yīng)該提供 Finalize 和 Dispose 方法,以便客戶端在使用完該對(duì)象后可以立即顯式釋放資源。
垃圾回收通常有利于提高總體性能,因?yàn)樗鼘⑺俣鹊闹匾灾糜趦?nèi)存利用率之上。只有當(dāng)內(nèi)存資源不足時(shí),才需要?jiǎng)h除對(duì)象;否則,將使用所有可用的應(yīng)用程序資源以 使您的應(yīng)用程序受益。但是,如果您的對(duì)象保持對(duì)非托管資源(例如,窗口句柄、文件、GDI 對(duì)象和網(wǎng)絡(luò)連接)的引用,則程序員通過在這些資源不再使用時(shí)顯式釋放它們可以獲得更好的性能。如果您要在客戶端方法調(diào)用過程中占據(jù)非托管資源,則對(duì)象應(yīng)該 允許調(diào)用方使用IDisposable 接口(它提供 Dispose 方法)顯式管理資源。通過實(shí)現(xiàn) IDisposable,對(duì)象將通知它可被要求明確進(jìn)行清理,而不是等待垃圾回收。實(shí)現(xiàn) IDisposable 的對(duì)象的調(diào)用方在使用完該對(duì)象后將簡(jiǎn)單地調(diào)用 Dispose 方法,以便它可以根據(jù)需要釋放資源。注如果您的可處置對(duì)象派生自另一個(gè)也實(shí)現(xiàn)了 IDisposable 接口的對(duì)象,則您應(yīng)該調(diào)用基類的 Dispose 方法以使其可以清理它的資源。您還應(yīng)該調(diào)用實(shí)現(xiàn)了 IDisposable 接口的對(duì)象所擁有的所有對(duì)象上的 Dispose。Finalize 方法也使您的對(duì)象可以在刪除時(shí)顯式釋放其引用的任何資源。由于垃圾回收器所具有的非確定性,在某些情況下,F(xiàn)inalize 方法可能長(zhǎng)時(shí)間不會(huì)被調(diào)用。實(shí)際上,如果您的應(yīng)用程序在垃圾回收器刪除對(duì)象之前終止,則該方法可能永遠(yuǎn)不會(huì)被調(diào)用。然而,需要使用Finalize 方法作為一種后備策略,以防調(diào)用方?jīng)]有顯式調(diào)用 Dispose 方法(Dispose 和 Finalize 方法共享相同的資源清理代碼)。通過這種方式,可能在某個(gè)時(shí)刻釋放資源,即使這發(fā)生在最佳時(shí)刻之后。注要確保 Dispose 和 Finalize 中的清理代碼不會(huì)被調(diào)用兩次,您應(yīng)該調(diào)用GC.SuppressFinalize 以通知垃圾回收器不要調(diào)用 Finalize 方法。垃圾回收器實(shí)現(xiàn)了 Collect 方法,該方法強(qiáng)制垃圾回收器刪除所有對(duì)象掛起刪除。不應(yīng)該從應(yīng)用程序內(nèi)調(diào)用該方法,因?yàn)榛厥罩芷谠诟邇?yōu)先級(jí)線程上運(yùn)行;厥罩芷诳赡軆鼋Y(jié)所有 UI 線程,從而使得用戶界面停止響應(yīng)。
相關(guān)推薦:
2018年軟考報(bào)名時(shí)間※2018軟考考試安排(全年)
考試吧特別策劃:2018年計(jì)算機(jī)軟考報(bào)考指南專題
2018年計(jì)算機(jī)軟件水平考試各科目復(fù)習(xí)知識(shí)點(diǎn)匯總
2009年下半年計(jì)算機(jī)軟考電子商務(wù)技術(shù)員真 |
2008年下半年計(jì)算機(jī)軟考電子商務(wù)技術(shù)員真 |
2012年下半年軟件水平考試真題及答案解析 |
2012年下半年軟件水平考試真題及答案解析 |
2012年下半年軟件水平考試真題及答案解析 |
2018計(jì)算機(jī)軟考《電子商務(wù)技術(shù)員》試題及 |
2018計(jì)算機(jī)軟考《電子商務(wù)技術(shù)員》試題及 |
2018計(jì)算機(jī)軟考《電子商務(wù)技術(shù)員》試題及 |
2018計(jì)算機(jī)軟考《電子商務(wù)技術(shù)員》試題及 |
2018軟件水平考試《信息技術(shù)處理員》預(yù)習(xí) |
北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |