为什么检查对象是否为null会在编译时导致警告?

时间:2015-07-30 14:31:26

标签: .net vb.net

这个项目在某个方法中有这个代码:

Dim pDataTable As DataTable
Dim pDS As DataSet

pDS = someClass.GetSomeDataSet()

If (pDS.Tables.Count > 0) Then
    pDataTable = pDS.Tables("SomeTableName")
    foo(pDataTable)
EndIf


If (pDataTable IsNot Nothing) Then
    pDataTable.Dispose()
EndIf

pDataTable = Nothing

很好奇,但为什么If (pDataTable IsNot Nothing) Then会引发此警告:

  

变量'pDataTable'在赋值之前使用。在运行时可能会产生空引用异常。

我完全理解它告诉我的是什么。如果我只是调用pDataTable.Dispose()并且它从未在第一个if块中实例化,那么我的应用程序将会爆炸。但是为什么它会产生一个警告,只是简单地将一个值与null进行比较?

如果我想摆脱这个警告,我是否应该更改pDataTable的声明以创建DataTable的新实例?

1 个答案:

答案 0 :(得分:6)

如果要在将其分配到别处之前使用它,则应将其值设置为null:

Dim pDataTable As DataTable = Nothing

这甚至适用于您检查其值的情况,即使您只是检查它是否为空,例如通过If (pDataTable IsNot Nothing)。不幸的是,编译器不够聪明,无法意识到你正在检查它是否为空,因此警告。