考虑代码:
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
块是否会自动清除任何资源?
答案 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.Dispose
(StreamReader
与调用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
无论什么 - 抛出或不抛出异常。)