声明块的 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 |
可选。 要传递给构造函数以创建 < |
resourceexpression |
必填。 引用满足 <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
块的效果相同。
Nothing
如果是resourcename
,则不调用Dispose任何异常,也不会引发异常。
使用块内的结构化异常处理
如果需要处理块中可能发生的Using
异常,可以向其添加完整的 Try
Finally
...构造。 如果需要处理 Using
语句在获取资源时未成功的情况,可以测试是否 resourcename
成功 Nothing
。
结构化异常处理,而不是使用块
如果需要更好地控制资源的获取,或者需要块中的其他 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