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 可选。 要传递给构造函数以创建 <a0/> 实例的参数列表。 请参阅 参数列表
resourceexpression 必填。 引用满足 <a0/> 要求的系统资源的变量或表达式。 如果使用第二种语法替代方法,则必须在将控件 Using 传递给语句之前获取资源。

注解

有时,代码需要非托管资源,例如文件句柄、COM 包装器或 SQL 连接。 当 Using 代码完成后,块可以保证处理一个或多个此类资源。 这使它们可供其他代码使用。

托管资源由 .NET Framework 垃圾回收器(GC)处理,无需进行任何额外的编码。 不需要 Using 托管资源的块。 但是,你仍然可以使用 Using 块来强制处置托管资源,而不是等待垃圾回收器。

Using 有三个部分:购置、使用情况和处置。

  • 获取 意味着创建变量并初始化它以引用系统资源。 该 Using 语句可以获取一个或多个资源,也可以在输入块之前获取一个资源,并将其提供给 Using 语句。 如果提供 resourceexpression,则必须在将控制权 Using 传递给语句之前获取资源。

  • 使用 意味着访问资源并对其执行作。 两者之间 Using 的语句和 End Using 表示资源的使用情况。

  • 处置意味着在对象上resourcename调用Dispose该方法。 这样,对象就可以干净地终止其资源。 该 End Using 语句释放块控制下 Using 的资源。

行为

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

语句获取 Using 的每个资源变量的范围仅限于 Using 块。

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

Nothing如果是resourcename,则不调用Dispose任何异常,也不会引发异常。

使用块内的结构化异常处理

如果需要处理块中可能发生的Using异常,可以向其添加完整的 TryFinally ...构造。 如果需要处理 Using 语句在获取资源时未成功的情况,可以测试是否 resourcename 成功 Nothing

结构化异常处理,而不是使用块

如果需要更好地控制资源的获取,或者需要块中的其他 Finally 代码,则可以将 Using 块重写为 Try...Finally 构造。 下面的示例演示了在获取和处置resource中等效的骨架TryUsing构造。

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

另请参阅