2014-02-05 27 views
1

我正在使用Visual Studio 2012並具有以下代碼塊。代碼檢查特定文件的文件類型(這就是爲什麼返回True/False)。如果遇到錯誤,它也會返回false。我得到的警告是我在初始化之前使用了fs/br變量,這是真的。這就是爲什麼我有IsNothing語句,但是我在IsNothing語句中得到了警告,我不知道如何避免這種情況,因爲我不想將語句fs = New FileStream(fn, FileMode.Open)br = ...置於Try/Catch塊之外。在IsNothing()語句中避免調試器警告

該代碼本身的作品,所以警告不是一個真正的問題,但它仍然困擾我有他們。有沒有人看到一個解決方案如何可以改變這個塊提供相同的安全性沒有警告?

歡迎使用VB.NET或C#答案。

  Dim fs As FileStream 
      Dim br As BinaryReader 
      Try 
       fs = New FileStream(fn, FileMode.Open) 'Open the file 
       br = New BinaryReader(fs) 'Initilize the reader 
       'File reading code omitted here 
       br.Close() 'Close the reader and underlying stream 
      Catch 
       If Not IsNothing(fs) Then fs.Close() 'Warning here 
       If Not IsNothing(br) Then br.Close() 'and here 
       Return False 
      End Try 
+1

不是調試器,它是編譯器發出警告。它不夠聰明,無法理解IsNothing()方法實際上是爲了處理未初始化的對象而編寫的。不要像這樣編寫代碼,而是使用* Using *語句。 –

+0

謝謝Hans,我解釋了我的(錯誤的)圖案,因爲在評論中沒有使用Using語句來接受答案,但我現在將更改我的代碼。 – Jens

回答

2

這就是爲什麼我有IsNothing聲明

這表明你希望他們給一個特定的值之前IsNothing值。在C#中,這不僅僅是一個警告 - 這將是一個錯誤。

我有兩個建議:

  • 如果你真的要遵循這個模式,只需設置值Nothing入手:

    Dim fs As FileStream = Nothing 
    Dim br As BinaryReader = Nothing 
    
  • 如果可能的話,重組你的代碼,所以你可以只使用Using語句,這將以任何方式關閉塊末尾的流。儘管目前我們還無法告訴足夠的其他代碼以幫助您做到這一點。
+0

我有IsNothing部分,因爲它可能已經在'fs = New FileStream(fn,FileMode.Open)'處引發異常。這就是爲什麼我不想使用使用語句。其實這是一個簡單的問題:如果我會像Try - >使用fs作爲新的FileStream(...) - > Code - > End Using - > Catch - > Return False - > End Try和會出現異常情況:在這種情況下流會關閉還是保持打開狀態? – Jens

+1

@Jens:我不明白你所說的是不使用'Using'語句的原因。我可能會有兩個嵌套的'Using'語句 - 一個用於'FileStream',另一個用於'BinaryReader' - 儘管您可能只用'使用reader作爲BinaryReader = new BinaryReader(new Filestream(...) )'如果我們可以假設'BinaryReader'構造函數不會拋出異常。 –

+0

我的錯誤是假設如果在using語句中發生異常,流將不會關閉(文件將保持打開狀態)。但事實並非如此,所以我將使用try/catch中的嵌套使用語句。非常感謝你。 – Jens

1

可以重新寫,而無需使用嵌套使用塊 - 你可以做到這一切在同一行 - 我不相信你可以在C#中做到這一點:

Try 
     Using fs As New FileStream(fn, FileMode.Open), br As New BinaryReader(fs) 
      Try 

      Catch ex As Exception 
       'an exception here indicates an issue reading the file 
      End Try 
     End Using 
    Catch ex As Exception 
     'an exception here indicates an issue opening the filestream or reader 
    End Try 

的使用塊可確保對象無需明確調用即可處理.Dispose它也稱爲.Close因此,您甚至不需要該行

+0

謝謝。這基本上是我在之前的答案之後改變了它。我遺漏了內在的嘗試/捕捉,因爲我不需要那種迷戀。我也在初步測試中發現,即使在內部引發異常,流也會關閉。好答案。 – Jens