VB.NET - IsNothing与什么都没有

时间:2008-08-08 09:45:29

标签: vb.net nothing

这里有没有人使用VB.NET,并强烈偏好或反对使用IsNothing而不是Is Nothing(例如,If IsNothing(anObject)If anObject Is Nothing...)?如果是这样,为什么?

编辑:如果你认为它们都是同样可以接受的,你认为最好选择一个并坚持使用它,或者混合它们是否可以?

9 个答案:

答案 0 :(得分:120)

如果你看一下正在执行的MSIL,你会发现它没有编译成完全相同的代码。当您使用IsNothing()时,它实际上调用该方法而不是仅仅计算表达式。

我倾向于倾向于使用“Is Nothing”的原因是当我否定它变成“IsNot Nothing”而不是“Not IsNothing(object)”时,我个人认为它看起来更具可读性。

答案 1 :(得分:43)

我发现Patrick Steele在他的博客上最好地回答了这个问题:Avoiding IsNothing()

我没有在这里复制他的任何答案,以确保帕特里克斯蒂尔获得他的职位。但我确实认为,如果你想决定是否使用Is Nothing或IsNothing,你应该阅读他的帖子。我想你会同意Is Nothing是最好的选择。

编辑 - VoteCoffe的评论

部分文章内容:在查看更多代码后,我发现了另一个原因,你应该避免这种情况:它接受值类型!显然,因为IsNothing()是一个接受'对象'的函数,所以你可以传递你想要的任何东西。如果它是一个值类型,.NET会将它装入一个对象并将其传递给IsNothing - 它总是在盒装值上返回false! VB.NET编译器将检查“Is Nothing”样式语法,如果您尝试对值类型执行“Is Nothing”,则不会编译。但IsNothing()函数编译没有抱怨。 -PSteele - VoteCoffee

答案 2 :(得分:31)

您绝对应该避免使用IsNothing()

以下是文章IsNothing() VS Is Nothing

中的 4个原因
  1. 最重要的是,IsNothing(object)将所有内容作为对象传递给它,甚至是值类型!由于价值类型不能是Nothing,因此这是一个完全浪费的检查 请看以下示例:

    Dim i As Integer
    If IsNothing(i) Then
       ' Do something 
    End If
    

    这将编译并运行正常,而这:

    Dim i As Integer
    If i Is Nothing Then
        '   Do something 
    End If
    

    不会编译,而编译器会引发错误:

      

    'Is'运算符不接受'Integer'类型的操作数   操作数必须是引用或可空类型。

  2. IsNothing(object)实际上是Microsoft.VisualBasic.dll的一部分 这是不可取的,因为您对VisualBasic库有不必要的依赖。

  3. 它的速度慢 - 实际上慢了33.76%(超过10亿次迭代)!

  4. 也许是个人偏好,但IsNothing()读起来像Yoda Condition。当您查看变量时,您正在检查它的状态,并将其作为调查的主题。

    即。 做x? --- x it 的属性?

    所以我认为If a IsNot Nothing的阅读效果优于If Not IsNothing(a)

答案 3 :(得分:29)

我同意“没什么”。如上所述,很容易否定“IsNot Nothing”。

我觉得这更容易阅读...

If printDialog IsNot Nothing Then
    'blah
End If

比......

If Not obj Is Nothing Then
    'blah
End If

答案 4 :(得分:5)

VB充满了类似的东西,试图使它既“像英语一样”,也适合那些习惯使用()和{}的语言的人。 例如,在“喜欢英语”方面...... VB有“Ain't”关键字......不,我不是在开玩笑。而另一方面,正如您可能已经知道的那样,如果您愿意,可以在函数调用中使用(),但不必如此。

我更喜欢IsNothing()...但我使用的是C和C#,所以这就是舒适。而且我认为它更具可读性。但是对你来说感觉更舒服。

答案 5 :(得分:5)

我倾向于“没什么”替代方案,主要是因为它看起来更像是OO。

当然,Visual Basic ain't获得了Is not keyword。

答案 6 :(得分:2)

我也倾向于使用Is Nothing版本部分地使用它,就像我在SQL中一样。

答案 7 :(得分:1)

我最初使用的是IsNothing,但我一直在使用Is Nothing进行更新的项目,主要是为了提高可读性。我坚持使用IsNothing的唯一一次是,如果我维护的代码在整个过程中使用,我希望保持一致。

答案 8 :(得分:-2)

Nothing是否需要已赋值为Nothing的对象。 IsNothing()可以接受任何尚未初始化的变量,包括数字类型。例如,在测试是否已传递可选参数时,这很有用。