我最近编写了一段代码,其中在完成后,我收到了编译器的警告,告诉我我的一个变量在被赋值之前被使用。实际上,如果没有事先实例化对象,就永远不会对该对象进行方法调用。这是代码片段
Try
fs = New FileStream(fileName, FileMode.Open)
Dim PolarMatrix As PolarMatrix
PolarMatrix = DirectCast(bf.Deserialize(fs), PolarMatrix)
fs.Close()
Return TypeOfStructure.Polar
Catch ex As Exception
fs.Close() 'Warning on this line: Variable 'fs' is used before it has been assinged a value
End Try
我假设我收到此警告,因为Try部分中的第一行可能是抛出错误的行,而Object永远不会被实例化。 FileName虽然是传递给此方法的变量,该变量已经检查过错误,因此保证是正确的。我希望可能抛出的错误出现在反序列化过程中。
所以我的问题:当对编译器认为可能没有实例化的对象发出警告时,这是否会否定用户知道该行上永远不会出现问题?有时需要添加代码只是为了安抚编译器吗?或者我在这里做了什么不好的练习?
答案 0 :(得分:2)
你如何确定fs将始终被实例化,即使文件名是正确的,它仍然可能由于许多其他原因而无法打开。
然而,解决这个问题的简单方法是完全摆脱捕获并使用Using语句代替:
Try
Using fs = New FileStream(fileName, FileMode.Open)
Dim PolarMatrix As PolarMatrix
PolarMatrix = DirectCast(bf.Deserialize(fs), PolarMatrix)
Return TypeOfStructure.Polar
End Using
Catch ex as Exception
' do something here
End Try
这意味着当此段代码存在时,fs将自动处理,并Stream.Dispose关闭流。
要回答你的实际问题,有时编译器是错误的,你必须要么忽略警告或添加一些额外的代码才能使它们消失,但一般来说,假设编译器是正确的,直到你绝对确定情况并非如此。