Using 陳述式 (Visual Basic)
宣告 Using 區塊的開頭,並選擇性地取得區塊所控制的系統資源。
Using { resourcelist | resourceexpression }
[ statements ]
End Using
組件
詞彙 |
定義 |
resourcelist |
如果未提供 resourceexpression,則為必要項。 這個 Using 區塊所控制之一或多個系統資源的清單。 |
resourceexpression |
如果未提供 resourcelist,則為必要項。 參考此 Using 區塊控制之系統資源的參考變數或運算式。 |
statements |
選擇項。 Using 區塊執行的陳述式區塊。 |
End Using |
必要項。 結束 Using 區塊的定義,並處置 (Dispose) 它控制的所有資源。 |
在 resourcelist 部分中的每個資源,都具備下列語法及參數:
resourcename As New resourcetype [ ( [ arglist ] ) ]
-或-
resourcename As resourcetype = resourceexpression
resourcelist 參數
詞彙 |
定義 |
resourcename |
必要項。 參考變數,參考 Using 區塊控制的系統資源。 |
New |
如果 Using 陳述式會取得資源,則為必要項。 如果您已取得資源,請使用第二個語法代替。 |
resourcetype |
必要項。 資源的類別。 類別必須實作 IDisposable 介面。 |
arglist |
選擇項。 您傳遞至建構函式 (Constructor),以建立 resourcetype 執行個體的引數清單。 請參閱參數清單 (Visual Basic)。 |
resourceexpression |
必要項。 變數或運算式,參考滿足 resourcetype 之需求的系統資源。 如果您使用第二個語法代替,必須先取得資源,才能將控制傳遞至 Using 陳述式。 |
備註
有時候程式碼需要 Unmanaged 資源,例如,檔案控制代碼 (File Handle)、COM 包裝函式或 SQL 連接。 程式碼完成處理一或多個這類資源時,Using 區塊保證會處置它們, 讓其他程式碼也可以使用它們。
Managed 資源是由 .NET Framework 記憶體回收行程 (GC) 處置,而不需另行編碼。 您不需要 Using 區塊即可使用 Managed 資源。 但是您仍然可以使用 Using 區塊,強制處置 Managed 資源,而不是等待記憶體回收行程。
Using 區塊有三個參數:擷取、使用方式和處置。
「擷取」(Acquisition) 表示建立變數,並將該變數初始設定為參考系統資源。 Using 陳述式可以取得一或多個資源,或者可以在輸入區塊之前確切取得一個資源,然後將此資源提供給 Using 陳述式。 如果您提供 resourceexpression,則必須先取得資源,才能將控制傳遞至 Using 陳述式。
「使用方式」(Usage) 表示會存取資源並利用這些資源來執行動作。 Using 和 End Using 之間的陳述式代表資源的使用方式。
「處置」(Disposal) 表示在 resourcename 中的物件上呼叫 Dispose 方法。 這可讓物件徹底終止其資源。 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.
Finally
resource.Dispose()
End Try
注意事項 |
---|
Using 區塊內部的程式碼不應該將 resourcename 中的物件指派給其他變數。 結束 Using 區塊時會處置資源,而其他變數則無法存取它所指向的資源。 |
範例
下列範例會使用 Using 區塊取得新字型。 這可保證當程式碼結束區塊時,系統會在字型上呼叫 Dispose 方法。
Public Sub setbigbold(ByVal c As Control)
Using nf As New System.Drawing.Font("Arial", 12.0F,
System.Drawing.FontStyle.Bold)
c.Font = nf
c.Text = "This is 12-point Arial bold"
End Using
End Sub