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
语句之前获取资源。使用是指访问资源并使用它们执行操作。
Using
和End Using
之间的语句表示资源的使用情况。处置意味着对
resourcename
中的对象调用 Dispose 方法。 这允许对象完全终止其资源。 语句End Using
处置Using
块控制下的资源。
行为
块 Using
的行为类似于 Try
...Finally
构造,其中 Try
块使用资源, Finally
块处置资源。 因此,无论如何退出块,Using
块都保证资源处置。 即使在未经处理异常的情况下也是如此,但 StackOverflowException 除外。
Using
语句获取的每一个资源变量的范围都限制为 Using
块。
如果在 Using
语句中指定多个系统资源,则效果与将 Using
块嵌套在另一个块内的效果相同。
如果 resourcename
为 Nothing
,则不调用 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 的文件,将两行文本写入该文件。 该示例还读取同一文件并显示文本行:
由于 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