Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 为什么检查对象是否为null会在编译时引起警告?_.net_Vb.net - Fatal编程技术网

.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这是你提供的一个非常有趣的例子。谢谢。要回答为什么的问题,可能是因为编译器不够聪明,无法识别这种情况。它只是看到您试图使用一个未被明确赋值的变量,因此发出警告。要回答为什么问题,可能是因为编译器不够聪明,无法识别这种情况。它只是看到您正试图使用一个尚未明确指定的变量,因此发出警告。