2010-06-15 51 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