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

sab*_*669 1 .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
Run Code Online (Sandbox Code Playgroud)

只是好奇,但为什么会If (pDataTable IsNot Nothing) Then引起这个警告:

变量'pDataTable'在赋值之前使用.在运行时可能会导致空引用异常.

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

如果我想摆脱这个警告,我应该只是更改声明pDataTable还要创建一个新实例DataTable吗?

ror*_*.ap 6

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

Dim pDataTable As DataTable = Nothing
Run Code Online (Sandbox Code Playgroud)

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

  • 编译器不知道具体是否为空检查.它只是代码中第一个查询`pDataTable`的地方,编译器会注意到你只在代码的部分路径中为它分配了一个值.如果您将null检查更改为其他内容,同时仍使用`pDataTable`,您仍会收到警告. (3认同)