1

考虑代码:

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即使出现错误,块是否会自动清理任何资源?

4

3 回答 3

4

正如codeka所说,您不需要调用Closesr。它会自动调用,包括是否有错误。使用该using语句为您提供与try ... finally ... end try.

正如您在其他问题的答案中看到的那样,您不应该使用On Erroretc 只是这样做:

Try
  Using sr as StreamReader ...
     ...
  End Using
Catch ex as SomeException
...
End Try
于 2010-06-15T08:28:01.803 回答
1

是的, using 块将自动调用IDisposable.Dispose(这对于 aStreamReader与调用相同Close),因此您无需做任何事情(这就是using 块的全部意义!)

于 2010-06-15T08:18:51.623 回答
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

于 2010-06-15T08:34:50.030 回答