有時候程式碼需要 Unmanaged 資源,例如,檔案控制代碼 (File Handle)、COM 包裝函式或 SQL 連接。程式碼完成處理一或多個這類資源時,Using 區塊保證會處置它們,讓其他程式碼也可以使用它們。
Managed 資源是由 .NET Framework 記憶體回收行程 (GC) 處置,而不需另行編碼。您不需要 Using 區塊即可使用 Managed 資源。
Using 區塊有三個參數:擷取、使用方式和處置。
-
「擷取」表示建立變數,並將該變數初始設定為參考系統資源。Using 陳述式可以取得一或多個資源,或者可以在輸入區塊之前確切取得一個資源,然後將此資源提供給 Using 陳述式。如果您提供 resourceexpression,則必須先取得資源,才能將控制傳遞至 Using 陳述式。
-
「使用方式」表示會存取資源並利用這些資源來執行動作。Using 和 End Using 之間的陳述式代表資源的使用方式。
-
「處置」表示在 resourcename 中的物件上呼叫 Dispose 方法。這可讓物件徹底終止 Unmanaged 資源。End Using 陳述式會在 Using 區塊的控制下處置資源。
行為
Using 區塊的運作方式類似於 Try...Finally 語法結構,但 Try 區塊會使用資源,而 Finally 區塊則會處置這些資源。因此,不論結束區塊的方式為何,Using 區塊都保證會處置資源。即使是未處理的例外狀況 (Exception) 也一樣 (但 StackOverflowException 除外)。
Using 陳述式可取得的每個資源變數範圍會受限於 Using 區塊。
如果您在 Using 陳述式中指定多個系統資源,效果就和將 Using 區塊彼此組成巢狀一樣。
Using 區塊內的結構化例外處理
如果您需要處理可能是在 Using 區塊內發生的例外狀況,則可以在該區塊中新增完整的 Try...Finally 語法結構。如果需要處理的狀況是 Using 陳述式未順利取得資源,則可以進行測試,以查看 resourcename 是否為 Nothing。
取代 Using 區塊的結構化例外處理
如果您需要在擷取資源時有更好的控制,或是在 Finally 區塊中需要其他程式碼,則可以將 Using 區塊重新撰寫為 Try...Finally 語法結構。下列範例會顯示基本架構 Try 和 Using 語法結構,這兩個語法結構同等於擷取和處置 resource。
Using resource As New resourceType
' Insert code to work with resource.
End Using
' THE FOLLOWING TRY CONSTRUCTION IS EQUIVALENT TO THE USING BLOCK
Dim resource As New resourceType
Try
' Insert code to work with resource.
Catch ex As Exception
' Insert code to process exception.
Finally
' Insert code to do additional processing before disposing of resource.
resource.Dispose()
End Try 注意事項 |
|---|
| Using 區塊內部的程式碼不應該將 resourcename 中的物件指派給其他變數。結束 Using 區塊時會處置資源,而其他變數則無法存取它所所指向的資源。 |