.net 为什么检查对象是否为null会在编译时引起警告?
此工作中的项目以某种方式包含以下代码:.net 为什么检查对象是否为null会在编译时引起警告?,.net,vb.net,.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 pD
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
只是好奇,但是为什么如果(pDataTable不是空的)那么会导致此警告:
变量“pDataTable”在赋值之前使用。运行时可能会导致空引用异常
我完全明白它在告诉我什么。如果我只调用pDataTable.Dispose()
,而它在第一个If块中从未被实例化,那么我的应用程序就会崩溃。但是,为什么它会简单地将值与null进行比较而生成警告呢
如果我想消除此警告,我是否应该更改pDataTable
的声明,以同时创建DataTable
的新实例?如果要在其他地方分配它之前使用它,则在声明时应将其值设置为null:
Dim pDataTable As DataTable = Nothing
这甚至适用于您正在检查其值的情况,即使您只是检查它是否为null,例如通过if(pDataTable不是空的)
。不幸的是,编译器不够聪明,无法意识到您正在检查它是否为null,因此会发出警告。如果要在其他地方分配它之前使用它,则在声明它时应将它的值设置为null:
Dim pDataTable As DataTable = Nothing
这甚至适用于您正在检查其值的情况,即使您只是检查它是否为null,例如通过if(pDataTable不是空的)
。不幸的是,编译器不够聪明,无法意识到您正在检查它是否为null,因此出现了警告。在我3年的经验中,我从未见过这样的情况。这是一种常见的做法,或者更确切地说,只是“技术上你应该这样做,但没有人这样做,这真的没什么大不了的”?看,关键是,变量在使用之前需要有一个值。如果要使用它,即使它位于类似于If(pDataTable不是空的)
的语句中,也需要先有一个值。无论是在声明它的同一行上分配它(如我所示),还是在几行之后分配它,只要在使用它之前分配它就行了。编译器不知道这是一个空检查。它只是代码中第一个查询pDataTable
的位置,编译器会注意到您只在代码的部分路径中为它赋值。如果您在仍然使用pDataTable
的情况下将空检查更改为其他内容,您仍然会收到警告。我正在回答您为什么可能需要显式初始化,但随后它作为副本关闭。因此,如果你好奇的话,我将答案添加到了。@A.Franklin这是你提供的一个非常有趣的例子。谢谢。在我3年的工作经验中,我从来没有见过这样的情况。这是一种常见的做法,或者更确切地说,只是“技术上你应该这样做,但没有人这样做,这真的没什么大不了的”?看,关键是,变量在使用之前需要有一个值。如果要使用它,即使它位于类似于If(pDataTable不是空的)
的语句中,也需要先有一个值。无论是在声明它的同一行上分配它(如我所示),还是在几行之后分配它,只要在使用它之前分配它就行了。编译器不知道这是一个空检查。它只是代码中第一个查询pDataTable
的位置,编译器会注意到您只在代码的部分路径中为它赋值。如果您在仍然使用pDataTable
的情况下将空检查更改为其他内容,您仍然会收到警告。我正在回答您为什么可能需要显式初始化,但随后它作为副本关闭。因此,如果你好奇的话,我将答案添加到了。@A.Franklin这是你提供的一个非常有趣的例子。谢谢。要回答为什么的问题,可能是因为编译器不够聪明,无法识别这种情况。它只是看到您试图使用一个未被明确赋值的变量,因此发出警告。要回答为什么问题,可能是因为编译器不够聪明,无法识别这种情况。它只是看到您正试图使用一个尚未明确指定的变量,因此发出警告。