簡體   English   中英

C#USING關鍵字 - 何時何地不使用它?

[英]C# USING keyword - when and when not to use it?

我想知道什么時候應該而且不應該在USING塊中包裝東西。

根據我的理解,編譯器將其轉換為try / finally,最后在對象上調用Dispose()。

我總是使用圍繞數據庫連接和文件訪問的USING,但它更多的是習慣而不是100%的理解。 我知道你應該明確(或使用)Dispose()控制資源的對象,以確保它們立即釋放,而不是每當CLR感覺到它時,但那是我理解失敗的地方。

IDisposables在超出范圍時是否被處置掉?

當我的對象使用Dispose來整理自己時,我只需要使用USING嗎?

謝謝

編輯:我知道USING關鍵字上還有其他一些帖子,但我對CLR的相關答案更感興趣,內部究竟是什么

安德魯

不, IDisposable項目超出范圍時不會被處置。 正是由於這個原因,我們需要IDisposable - 用於確定性清理。

他們最終會收集垃圾,如果有終結器,它(可能)會被調用 - 但這可能是將來很長一段時間(不適合連接池等)。 垃圾收集取決於內存壓力 - 如果沒有什么需要額外的內存,則無需運行GC循環。

有趣的是(也許)有些情況下“使用”是一種痛苦 - 當有問題的類有時會在Dispose()上拋出異常時。 WCF是這個的罪犯。 我已經討論過這個話題(用一個簡單的解決方法) 在這里

基本上 - 如果類實現了IDisposable ,並且您擁有一個實例(即您創建它或其他任何實例),那么確保它被處置是您的工作。 這可能意味着通過“使用”,或者它可能意味着將其傳遞給承擔責任的另一段代碼。

我實際上已經看到了類型的調試代碼:

#if DEBUG
    ~Foo() {
        // complain loudly that smoebody forgot to dispose...
    }
#endif

Dispose調用GC.SuppressFinalize

“當IDisisposables超出范圍時,它們是不會被處置掉的嗎?”

不可以。如果IDisposable對象是可終結的 ,這不是一回事,那么它將在收集垃圾時完成。

哪個可能很快或幾乎從不。

Jeff Richter的C#/ CLR書非常適合所有這些內容,而且框架設計指南書也很有用。

當我的對象使用Dispose來整理自己時,我只需要使用USING嗎?

當對象實現IDisposable時,您只能使用'using'。 如果您嘗試不這樣做,編譯器將反對。

要添加到其他的答案,你應該使用using只要對象持有多托管內存以外的任何資源(或者明確的處置)。 例如文件,套接字,數據庫連接,甚至是GDI繪圖句柄。

垃圾收集器最終將最終確定這些對象,但僅限於將來某些未指定的時間。 您不能及時依賴它,並且在此期間您可能已經耗盡了該資源。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM