3 回答

TA貢獻(xiàn)2036條經(jīng)驗(yàn) 獲得超8個(gè)贊
完成某些對(duì)象后,需要采取一些措施。通常這是因?yàn)閷?duì)象使用某種需要處置的資源。例如,如果您具有文件類File的文件對(duì)象,并且該對(duì)象從文件系統(tǒng)中打開文件,則需要再次關(guān)閉文件系統(tǒng)中的文件。
如果您只是離開了文件對(duì)象,而忘記了調(diào)用file.Close(),則直到垃圾回收器(GC)運(yùn)行并且沒有使用任何文件對(duì)象時(shí),它才會(huì)被清除。垃圾收集器的運(yùn)行時(shí)間應(yīng)由公共語言運(yùn)行時(shí)(CLR)決定。如果在處理完文件后GC仍未運(yùn)行很長時(shí)間,則文件可能會(huì)保持打開狀態(tài)很長時(shí)間。如果有許多文件對(duì)象,或者如果某人想要打開文件,這可能會(huì)帶來很大的問題,但不能這樣做,因?yàn)榱粝碌奈募?duì)象仍然在閑逛。
為了解決此問題,C#具有IDisposable接口。這有一種稱為“處置”的方法。需要一些清理的類實(shí)現(xiàn)了此Dispose方法。這為您提供了一種清理使用資源的對(duì)象的標(biāo)準(zhǔn)方法。有很多類需要調(diào)用Dispose。這樣做的問題是代碼包含了對(duì)Dispose的調(diào)用,并且遵循它們很棘手,因?yàn)槟陆▽?duì)象并調(diào)用Dispose進(jìn)行清理的位置不同。因此,您必須仔細(xì)檢查代碼,并非常小心地檢查是否在正確的位置調(diào)用了Dispose。
為了解決此問題,C#引入了“ using”關(guān)鍵字。您可以在新對(duì)象的周圍放置“ using”關(guān)鍵字,這樣可以確保為您調(diào)用Dispose。它保證無論發(fā)生什么情況都將調(diào)用Dispose ...即使在using語句的主體中引發(fā)了異常。
因此,當(dāng)您要確保將清除分配資源的對(duì)象時(shí),應(yīng)使用“使用”。
using僅可用于在堆棧上即函數(shù)中聲明的對(duì)象。它對(duì)于聲明為類成員的對(duì)象不起作用。對(duì)于他們,您必須致電Dispose。您可能必須在您的類中實(shí)現(xiàn)Dispose,以便in可以在其需要它的任何成員對(duì)象上調(diào)用Dispose。
需要使用調(diào)用的常見對(duì)象有:文件,數(shù)據(jù)庫連接,圖形對(duì)象(如筆和畫筆)。
當(dāng)您希望兩個(gè)操作同時(shí)發(fā)生時(shí),有時(shí)也會(huì)使用它。例如,如果您想在輸入代碼塊并退出代碼時(shí)編寫一條日志語句,則可以編寫一個(gè)可以使用的日志類,如下所示:
using( Log log = new Log("Doing stuff") )
{
// Stuff
}
可以使log類的構(gòu)造函數(shù)寫出消息,而Dispose方法也可以寫出消息。實(shí)現(xiàn)終結(jié)器(?Log)以斷言是否未調(diào)用Dispose方法,以確保在“新Log”周圍記住“ using”。

TA貢獻(xiàn)1842條經(jīng)驗(yàn) 獲得超21個(gè)贊
我看到很多其他的答案時(shí)表示你應(yīng)該有一個(gè)using
說法。我想解決的時(shí)候,特意應(yīng)該不會(huì)有一個(gè)using
說法:
如果需要在當(dāng)前函數(shù)范圍之外使用對(duì)象,則不要使用using
塊。一個(gè)很好的例子是返回?cái)?shù)據(jù)庫連接的工廠方法或需要返回?cái)?shù)據(jù)讀取器的方法。在任何一種情況下,如果使用using
語句創(chuàng)建對(duì)象,則該對(duì)象將在返回方法之前被處理,因此無法在方法外部使用。
現(xiàn)在,您仍然要確保已處置這些對(duì)象,因此您仍可能需要在using
某處聲明。只是不要在實(shí)際創(chuàng)建對(duì)象的方法中包括它。相反,您可以將函數(shù)調(diào)用本身包裝在一條using
語句中。
- 3 回答
- 0 關(guān)注
- 463 瀏覽
添加回答
舉報(bào)