using 資源清理

2022-04-29 05:06:07 字數 1681 閱讀 3383

(三)資源清理

由來:要理解清楚使用using語句強制清理資源,就首先從了解dispose模式說起,而要了解dispose模式,則應首先了解.net的垃圾**機制。 .net提供了dispose模式來實現顯式釋放和關閉物件的能力。

dispose模式

dispose模式是.net提供的一種顯式清理物件資源的約定方式,用於在.net 中釋放物件封裝的非託管資源。因為非託管資源不受gc控制,物件必須呼叫自己的dispose()方法來釋放,這就是所謂的dispose模式。從概念角度來看,dispose模式就是一種強制資源清理所要遵守的約定;從實現角度來看,dispose模式就是讓要乙個型別實現idisposable介面,從而使得該型別提供乙個公有的dispose方法。

using語句提供了強制清理物件資源的便捷操作方式,允許指定何時釋放物件的資源源。

所有擁有非託管資源的型別都會實現idisposable介面,如果我們忘記dispose()方法,其中的非記憶體資源會在隨後終結器執行時釋放,這樣物件在記憶體中存放的時間就比較長,應用程式對資源的清理比較慢。

c#中的using語句可以dispose()方法被呼叫,我們可以在using語句中分配乙個物件,c#編譯器會為每乙個物件自動產生乙個try/finally塊。

下面的兩端**將生成一樣的il**。

string connstr = string.empty;

sqlconnection conn = null;

//using 語句示例

using (sqlconnection conn = new sqlconnection(connstr))

//try/finally塊

tryfinally

誤區:(1)對沒有實現idisposable()介面的物件使用using語句。

例子://object物件沒有實現idisposeable介面

using (object obj = factory.createresource())

//修正版本

object obj=factory.createresource();

using (obj as idsposeable)

如果沒有實現idisopose介面,在上面的情況下,using語句退化為using(null),這種做法非常的安全,只是不會做任何的事情。

(2) 潛在的資源洩漏

sqlconnection conn=new sqlconnection(connstr);

sqlcommand cmd=new sqlcommand(cmdstr,conn);

using(conn as idisposeable)

using (cmd as idisposeable)

確保任何實現了idisposeable()介面的物件都在using和try塊中分配,否則有可能出現記憶體洩漏。

乙個方法中有多個需要釋放的資源的物件時,可以建立多個using塊,或者自己寫乙個try/finally塊,兩種方法是等效的,產生的il**是完全一樣的。

有些物件既實現了dispose()又實現了close()。

dispose()除了釋放資源外,還會通知垃圾**器這個物件不再需要終結操作。dispose()通過gc.suppressfinaize()方法來實現這一點,close()一般不會這麼做。因此呼叫過close()的物件仍然留在終結佇列中,dispose()不會將物件從記憶體中刪除,它只是讓物件釋放非託管資源。

1 使用using釋放資源

using語句有二個關鍵字 作為關鍵字,using可以匯入命名空間 作為c 語句,using可以釋放物件占用的記憶體資源 語法 using sqlconnection conn new sqlconnection data source initial catalog myschool uid sa...

android studio 清理無用資源

下面說說如何清除無用資源。一 apk打包時去除無用的資源 buildtypes release 在buildtypes下的debug或release下新增shrinkresources true,這樣打包時就不會把無用的資源打包進apk中。注意 這樣只是打包時可以減少apk的體積,但是專案中的無用資...

清理 Docker 無用資源

修剪映象 容器和網路的快捷方式 docker system prune 修剪映象 容器和網路,和卷的快捷方式 docker system prune volumes 清理none映象 虛懸映象 命令 docker image prune 預設情況下,docker image prune 命令只會清理...