Using 语句 (Visual Basic)

声明 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 语句之前获取资源。

  • 使用是指访问资源并使用它们执行操作。 UsingEnd Using 之间的语句表示资源的使用情况。

  • 处置意味着对 resourcename 中的对象调用 Dispose 方法。 这允许对象完全终止其资源。 语句 End Using 处置 Using 块控制下的资源。

行为

Using 的行为类似于 Try...Finally 构造,其中 Try 块使用资源, Finally 块处置资源。 因此,无论如何退出块,Using 块都保证资源处置。 即使在未经处理异常的情况下也是如此,但 StackOverflowException 除外。

Using 语句获取的每一个资源变量的范围都限制为 Using 块。

如果在 Using 语句中指定多个系统资源,则效果与将 Using 块嵌套在另一个块内的效果相同。

如果 resourcenameNothing,则不调用 Dispose,并且不会引发异常。

Using 块中的结构化异常处理

如果需要处理 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 的文件,将两行文本写入该文件。 该示例还读取同一文件并显示文本行:

由于 TextWriterTextReader 类实现 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

另请参阅