2010-06-15 48 views
1

考虑代码:VB.NET:关于“使用”问题块

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块是否会自动清除所有资源?

+2

看起来你错过了'Using'块的要点...... – 2010-06-15 08:30:36

+0

@Dan:我明白using块的变量只会在using块的范围内,我只是不确定如何很多清理工作都会完成,Close()是否会被调用。 – CJ7 2010-06-15 08:49:33

回答

1

是的,使用块会自动调用IDisposable.Dispose(对于一个StreamReader是与调用Close),所以没有什么你需要做的(这是使用块的整!)

+0

如果在使用块中出现错误,该怎么办?它仍然会调用Close()吗? – CJ7 2010-06-15 08:22:03

+1

是的,这就是使用块的目的。每当程序执行离开块时,它都会调用Dispose。 – Thorarin 2010-06-15 08:28:07

4

由于codeka说,你不需要拨打Close sr。它会自动调用,包括是否有错误。使用using声明可为您提供与try ... finally ... end try相同的功能。

而当你在回答您的其他问题看,你不应该使用On Error等只是做:

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

+10如果我可以为**你不应该使用在错误** – 2010-06-15 08:49:02

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块中是多余的(注意这是在使用,因为sr.CloseTry/Finally将在Finally被称为无论什么等价代码不必要的 - 抛出异常与否)。

+0

它不是调用Dispose(),它又调用Close()? – Panzercrisis 2013-10-21 18:37:16

+0

@Panzercrisis:是的,我相信。这已经有一段时间了,所以我不记得我是否知道在我写这个答案的时候。我想我是这样做的,只是觉得这是一个相当小的细节。接受的答案似乎明确表示。 – 2013-10-21 21:55:55