宣告區塊的 Using 開頭,並選擇性地取得區塊所控制的系統資源。
語法
Using { resourcelist | resourceexpression }
[ statements ]
End Using
組件
| 術語 | 定義 |
|---|---|
resourcelist |
如果您未提供 resourceexpression,則需要 。 此 Using 區塊控制的一或多個系統資源清單,並以逗號分隔。 |
resourceexpression |
如果您未提供 resourcelist,則需要 。 參考參考此區塊所要控制 Using 之系統資源的參考變數或表達式。 |
statements |
選擇性。 區塊執行的 Using 語句區塊。 |
End Using |
必須的。 終止 區塊的定義 Using ,並處置它控制的所有資源。 |
元件中的每個 resourcelist 資源都有下列語法和元件:
resourcename As New resourcetype [ ( [ arglist ] ) ]
-或-
resourcename As resourcetype = resourceexpression
resourcelist 元件
| 術語 | 定義 |
|---|---|
resourcename |
必須的。 參考變數,參考區塊所控制的系統資源 Using 。 |
New |
如果 Using 語句取得資源,則為必要項。 如果您已經取得資源,請使用第二個語法替代方法。 |
resourcetype |
必須的。 資源的類別。 類別必須實作 IDisposable 介面。 |
arglist |
選擇性。 您要傳遞至建構函式的自變數清單,以建立的 resourcetype實例。 請參閱參數清單。 |
resourceexpression |
必須的。 參考系統資源的變數或表達式符合 的需求 resourcetype。 如果您使用第二個語法替代方法,您必須先取得資源,才能將控制權傳遞至 Using 語句。 |
備註
有時候您的程式代碼需要非受控資源,例如檔句柄、COM 包裝函式或 SQL 連線。 區塊 Using 可確保當您的程式代碼完成時,可以處置一或多個這類資源。 這可讓其他程式代碼使用。
受控資源會由 .NET Framework 垃圾收集行程 (GC) 處置,而不會在您的部分進行任何額外的編碼。 您不需要 Using 受控資源的區塊。 不過,您仍然可以使用 Using 區塊來強制處置受控資源,而不是等候垃圾收集行程。
區塊有三個 Using 部分:取得、使用和處置。
擷取 表示建立變數並將其初始化,以參考系統資源。
Using語句可以取得一或多個資源,或者您可以在輸入 區塊之前取得一個資源,並將它Using提供給語句。 如果您提供resourceexpression,您必須先取得資源,才能將控制權傳遞至Using語句。使用 方式表示存取資源,並使用它們執行動作。 和
End Using之間的Using語句代表資源的使用方式。處置表示在中的
resourcename物件上呼叫 Dispose 方法。 這可讓物件完全終止其資源。End Using語句會處置區塊控件下Using的資源。
行為
Using區塊的行為就像 ...Finally 建構Try,Try區塊會使用資源,而Finally區塊會處置它們。 因此, Using 不論您如何結束區塊,區塊都保證會處置資源。 即使在未處理的例外狀況的情況下,也是如此,但 除外 StackOverflowException。
語句取得 Using 的每個資源變數範圍僅限於 Using 區塊。
如果您在語句中 Using 指定多個系統資源,效果會與巢狀 Using 區塊彼此相同。
如果 resourcename 為 Nothing,則不會呼叫 Dispose ,而且不會擲回例外狀況。
使用 區塊內的結構化例外狀況處理
如果您需要處理區塊內可能發生的 Using 例外狀況,您可以將完整的 Try...Finally 建構新增至該區塊中。 如果您需要處理語句無法成功取得資源的情況 Using ,您可以測試以查看 是否 resourcename 為 Nothing。
結構化例外狀況處理,而不是using區塊
如果您需要更精細地控制取得資源,或您需要區塊中的其他 Finally 程式碼,您可以將區塊重寫 Using 為 Try...Finally 建構。 下列範例顯示在 取得和處置 resource中相等的基本架構Try和Using建構。
Using resource As New resourceType
' Insert code to work with resource.
End Using
' For the acquisition and disposal of resource, the following
' Try construction is equivalent to the Using block.
Dim resource As New resourceType
Try
' Insert code to work with resource.
Finally
If resource IsNot Nothing Then
resource.Dispose()
End If
End Try
備註
區塊內的 Using 程式代碼不應該將 中的 resourcename 物件指派給另一個變數。 當您結束區塊時 Using ,會處置資源,而另一個變數則無法存取它指向的資源。
範例
下列範例會建立名為 log.txt 的檔案,並將兩行文字寫入檔案。 此範例也會讀取相同的檔案,並顯示文字行:
TextWriter由於和 TextReader 類別會實IDisposable作 介面,因此程式代碼可以使用 Using 語句來確保檔案在寫入和讀取作業之後正確關閉。
Private Sub WriteFile()
Using writer As System.IO.TextWriter = System.IO.File.CreateText("log.txt")
writer.WriteLine("This is line one.")
writer.WriteLine("This is line two.")
End Using
End Sub
Private Sub ReadFile()
Using reader As System.IO.TextReader = System.IO.File.OpenText("log.txt")
Dim line As String
line = reader.ReadLine()
Do Until line Is Nothing
Console.WriteLine(line)
line = reader.ReadLine()
Loop
End Using
End Sub