代码之家  ›  专栏  ›  技术社区  ›  AndyPerfect

对不“保证”要实例化的对象的方法调用

  •  0
  • AndyPerfect  · 技术社区  · 14 年前

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

    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部分的第一行可能是引发错误的行,并且对象永远不会被实例化。不过,文件名是一个正在传递给此方法的变量,该变量已经过错误检查,因此可以保证它是正确的。在反序列化过程中,可能会出现我希望抛出的错误。

    所以我的问题是:当对编译器认为可能尚未实例化的对象发出警告时,这是否会推翻用户知道在该行中永远不会出现问题的认识?有时有必要简单地添加代码以安抚编译器吗?或者我在这里做的是不好的练习?

    1 回复  |  直到 14 年前
        1
  •  2
  •   Hans Olsson    14 年前

    您如何确定总是实例化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 关闭流。

    为了回答你的实际问题,有时编译器是错误的,你要么忽略这些警告,要么添加一些额外的代码让它们消失,但一般来说,假设编译器是正确的,直到你完全确定情况并非如此。