方法调用未被“保证”实例化的对象

时间:2010-09-10 22:11:08

标签: vb.net

我最近编写了一段代码,其中在完成后,我收到了编译器的警告,告诉我我的一个变量在被赋值之前被使用。实际上,如果没有事先实例化对象,就永远不会对该对象进行方法调用。这是代码片段

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虽然是传递给此方法的变量,该变量已经检查过错误,因此保证是正确的。我希望可能抛出的错误出现在反序列化过程中。

所以我的问题:当对编译器认为可能没有实例化的对象发出警告时,这是否会否定用户知道该行上永远不会出现问题?有时需要添加代码只是为了安抚编译器吗?或者我在这里做了什么不好的练习?

1 个答案:

答案 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关闭流。

要回答你的实际问题,有时编译器是错误的,你必须要么忽略警告或添加一些额外的代码才能使它们消失,但一般来说,假设编译器是正确的,直到你绝对确定情况并非如此。