VB.NET:关于“使用”块的问题

时间:2010-06-15 08:17:33

标签: vb.net error-handling using-statement

考虑代码:

On Error Goto ErrorHandler

Using sr As StreamReader = New StreamReader(OpenFile)
    str = sr.ReadToEnd
    sr.Close()
End Using

Exit Sub

ErrorHandler:

如果Using块内有错误,您如何清理sr对象?

sr对象不在ErrHandler范围内,因此无法调用sr.Close()。即使出现错误,Using块是否会自动清除任何资源?

3 个答案:

答案 0 :(得分:4)

正如codeka所说,你不需要在sr上调用Close。它会自动调用,包括是否有错误。使用using语句可以提供与try ... finally ... end try相同的功能。

正如您在其他问题的答案中所看到的,您不应该只使用On Error等:

Try
  Using sr as StreamReader ...
     ...
  End Using
Catch ex as SomeException
...
End Try

答案 1 :(得分:1)

是的,使用屏幕会自动调用IDisposable.DisposeStreamReader与调用Close相同)因此您无需做任何事情(这就是整个使用块!)

答案 2 :(得分:1)

此代码:

Using sr As StreamReader = New StreamReader(OpenFile)
    str = sr.ReadToEnd
    sr.Close()
End Using

真的相当于:

Dim sr As StreamReader = Nothing
Try
    sr = New StreamReader(OpenFile)
    sr.Close() ' notice: unnecessary '
Finally
    sr.Close()
End Try

请注意,Finally块中的代码将始终执行,然后才会返回该方法(如果它抛出了自己的异常,那么,那么你就是为了一个世界受伤了。因此,sr.Close块中的Using行是多余的(请注意,使用Try / Finally的等效代码中没有必要,因为sr.Close将被调用在Finally无论什么 - 抛出或不抛出异常。)

相关问题