【发布时间】:2014-02-26 15:30:50
【问题描述】:
在下面的代码中,如果cmd 已经被初始化,那么我会确保在抛出异常之前关闭所有打开的连接。但是,即使在我检查 cmd 不为空之后,我仍然会在后续代码行中收到可能的空引用警告。
Dim cmd As SqlCommand
Try
'Do some Stuff
Catch ex As Exception
If cmd IsNot Nothing AndAlso
cmd.Connection IsNot Nothing AndAlso '<- null cmd warning
cmd.Connection.State = ConnectionState.Open Then '<- null cmd warning
cmd.Connection.Close() '<- null cmd warning
End If
Throw
End Try
我收到以下两个警告(可能一个来自 Resharper,一个来自 Visual Studio):
- 变量“x”在访问之前可能未初始化。运行时可能会发生空引用异常。
- BC42104:变量“x”在被赋值之前被使用。运行时可能会导致空引用异常。
应用程序至少有一个可能的路径通过其代码,该路径在分配任何值之前读取变量。
但我认为在代码中甚至没有一种可能的路径可以在不初始化的情况下使用变量。
- 是我犯了一些错误还是这是一个错误?
- 有没有办法阻止此警告出现?
截图如下:
这与此处已经提出的许多类似问题不同,例如 Prevent Resharper “Possible Null Reference Exception” warnings,因为我没有尝试允许 NullableType,而是已经保证我的变量不为空。
更新:
后续问题:为什么?
无论我的对象从未被初始化或初始化为Nothing,在这两种情况下cmd IsNot Nothing 都应该解析为False,因此AndAlso 之后的任何内容都不应被执行。
Dim cmd1 As SqlCommand
Console.Write(cmd1 IsNot Nothing) 'False
Dim cmd2 As SqlCommand = Nothing
Console.Write(cmd2 IsNot Nothing) 'False
也许编译器只是没有在编译时保证这一点的好方法。
【问题讨论】:
标签: .net vb.net visual-studio resharper code-analysis