我正在使用Visual Studio 2012并具有以下代码块。代码检查特定文件的文件类型(这就是为什么返回True / False)。如果遇到错误,它也会返回false。我得到的警告是我在初始化之前使用fs / br变量,这是真的。这就是为什么我有IsNothing语句,但我在IsNothing语句中得到警告,我不知道如何避免这种情况,因为我不想把fs = New FileStream(fn, FileMode.Open)
和br = ...
语句放在Try之外/ Catch block。
代码本身是有效的,所以警告并不是一个真正的问题,但它仍然困扰我。有没有人看到一个解决方案如何更改此块以提供相同的安全性而不发出警告?
欢迎使用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
答案 0 :(得分:2)
这就是为什么我有IsNothing语句
这表明在给定特定值之前,您希望值为IsNothing。在C#中,这不仅仅是一个警告 - 这将是一个错误。
我有两点建议:
如果确实想要遵循此模式,只需将值设置为Nothing
即可:
Dim fs As FileStream = Nothing
Dim br As BinaryReader = Nothing
Using
语句,这将在块的末尾以任何方式关闭流。我们现在无法充分了解其余的代码来帮助您实现这一目标。答案 1 :(得分: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
,因此您甚至不需要该行