小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

高效地使用連接 - 《C#高級(jí)編程(第3版)》

 donixli1314 2008-06-23
高效地使用連接
一般情況下,當(dāng)在
.NET中使用“稀缺”的資源時(shí),例如數(shù)據(jù)庫連接、窗口或圖形對(duì)象,最好確保每個(gè)資源在使用后立即關(guān)閉。盡管.NET的設(shè)計(jì)人員實(shí)現(xiàn)了自動(dòng)的垃圾收集,垃圾最終都會(huì)被回收,但仍需要盡可能早地釋放資源,以避免出現(xiàn)資源匱乏的情況。 

當(dāng)編寫訪問數(shù)據(jù)庫的代碼時(shí),這是非常明顯的,因?yàn)槭惯B接打開的時(shí)間略長于需要的時(shí)間,就可能影響其他會(huì)話。在極端的情況下,不關(guān)閉連接會(huì)使其他用戶無法進(jìn)入一整組數(shù)據(jù)表,極大地降低了應(yīng)用程序的性能。關(guān)閉數(shù)據(jù)庫連接應(yīng)是強(qiáng)制的,所以本節(jié)討論如何構(gòu)建代碼,把一直打開資源的風(fēng)險(xiǎn)降到最低。

主要有兩種方式可以確保數(shù)據(jù)庫連接等類似的“稀缺”資源在使用后立即釋放。

1. 第一種方式—— 利用trycatchfinally語句塊

確保釋放資源的第一種方式是利用trycatchfinally塊,確保在finally塊中關(guān)閉任何已打開的連接。下面是一個(gè)小示例:

try

{

   // Open the connection

   conn.Open();

   // Do something useful

}

catch ( Exception ex )

{

   // Do something about the exception

}

finally

{

   // Ensure that the connection is freed

   conn.Close ( ) ;

}

finally塊中,可以釋放已經(jīng)使用的任何資源。這種方式的惟一麻煩是必須確保關(guān)閉連接。很容易忘記在finally塊中添加關(guān)閉連接的命令,所以應(yīng)在編碼風(fēng)格上添加一些不容易出現(xiàn)反常情況的內(nèi)容。

另外,在給定的方法中可能會(huì)打開許多資源(例如兩個(gè)數(shù)據(jù)庫連接和一個(gè)文件),這樣trycatchfinally塊的層次有時(shí)可能不容易看懂。但還有另一個(gè)方式可以確保資源的關(guān)閉—— 使用using語句。

2. 第二種方式—— 使用using語句塊

在開發(fā)C#的過程中,.NET在對(duì)象不再引用之后清理它們的方法是使用非決定性的析構(gòu)方式,這已經(jīng)引起了一個(gè)非常熱烈的討論。

C++中,對(duì)象只要使用完畢,就會(huì)自動(dòng)調(diào)用其析構(gòu)函數(shù)。這對(duì)于設(shè)計(jì)基于資源的類的人員來說,是一個(gè)非常好的消息,因?yàn)槿绻脩敉涥P(guān)閉資源,使用析構(gòu)函數(shù)是非常理想的。只要對(duì)象使用完畢,就會(huì)調(diào)用C++析構(gòu)函數(shù)。所以,如果出現(xiàn)了異常,但沒有捕獲,有析構(gòu)函數(shù)的所有對(duì)象就會(huì)調(diào)用它們的析構(gòu)函數(shù)。

C#和其他托管語言中,沒有自動(dòng)、決定性的析構(gòu)方式,而是有一個(gè)垃圾收集器,它會(huì)在未來的某個(gè)時(shí)刻釋放資源。它是非決定性的,因?yàn)槲覀儾荒艽_定這個(gè)過程在什么時(shí)候發(fā)生。忘記關(guān)閉數(shù)據(jù)庫連接可能會(huì)導(dǎo)致.NET可執(zhí)行程序的各種問題。幸運(yùn)的是,我們還有解決的方法。下面的代碼說明了如何使用using子句確保實(shí)現(xiàn)IDisposable接口(詳見第4)的對(duì)象在退出塊時(shí)立即被釋放。

string source = "server=(local)\\NetSDK;" +

                " integrated security=SSPI;" +

                "database=Northwind";

 

using ( SqlConnection conn = new SqlConnection ( source ) )

{

   // Open the connection

   conn.Open ( ) ;

 

   // Do something useful

}

在這個(gè)示例中,無論塊是如何退出的,using子句都會(huì)確保關(guān)閉數(shù)據(jù)庫連接。

查看一下連接類的Dispose()方法的IL代碼,它們都檢查連接對(duì)象的當(dāng)前狀態(tài),如果其狀態(tài)為打開,就調(diào)用Close()方法。瀏覽.NET程序集的一個(gè)強(qiáng)大工具是Reflector(可以從/www.aisto.com/roeder/dotnet/上獲得)。這個(gè)工具允許查看任何.NET方法的IL代碼,還可以把IL代碼反編譯為源代碼,讓我們輕松地確定給定的方法的作用。

在編程時(shí),應(yīng)至少使用這兩個(gè)方法中的一個(gè),或者兩個(gè)方法都使用。無論在哪里獲得資源,最好都使用using ()語句,因?yàn)楸M管我們都會(huì)編寫Close()語句,但有時(shí)會(huì)忘記,此時(shí)using子句就會(huì)發(fā)揮作用。這兩種方式都沒有好的異常處理方式來替代,所以在大多數(shù)情況下,最好組合使用這兩種方法,如下面的示例所示。

try

{

   using (SqlConnection conn = new SqlConnection ( source ))

   {

      // Open the connection

      conn.Open ( ) ;

 

      // Do something useful

 

      // Close it myself

      conn.Close ( ) ;

   }

}

catch (Exception e)

{

   // Do something with the exception here...

}

這里顯式調(diào)用了Close(),但這是不必要的,因?yàn)?/span>using子句將確保在任何情況下都執(zhí)行關(guān)閉操作。但是,應(yīng)確保像這樣的資源盡可能早地釋放。因?yàn)樵趬K的其余部分可能有更多的代碼,而在這些地方?jīng)]有必要鎖定資源。

另外,如果在using塊中出現(xiàn)了異常,using子句就會(huì)確保在資源上調(diào)用IDisposable.Dispose方法,在本例中將確??偸顷P(guān)閉數(shù)據(jù)庫連接。這樣,與必須確保在異常子句中關(guān)閉連接相比,代碼的可讀性更高。

最后,如果編寫一個(gè)封裝資源的類,無論該資源是什么,都應(yīng)實(shí)現(xiàn)IDisposable接口,關(guān)閉資源。這樣,任何使用該類的代碼都可以利用using()語句,以確保資源被釋放。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多