IsNothing vs Nothing

问题描述 投票:128回答:9

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

编辑:如果您认为它们都同样可以接受,您是否认为最好选择一个并坚持使用,还是可以将它们混合在一起?

vb.net nothing
9个回答
122
投票

如果您在执行MSIL时查看它,将会发现它没有编译为完全相同的代码。当您使用IsNothing()时,它实际上是对该方法进行调用,而不是仅仅对表达式求值。

我倾向于使用“不存在”的原因是,当我否定它时,它变成了“ IsNot Nothing”而不是“ Not IsNothing(object)”,我个人觉得它更具可读性。


44
投票

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

我没有在这里复制他的任何答案,以确保帕特里克·斯蒂尔(Patrick Steele)对该职位的赞誉。但是我确实认为,如果您要尝试决定使用“无”还是“无”,则应该阅读他的文章。我认为您会同意“无为是”的最佳选择。

编辑-VoteCoffe在这里的评论

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


33
投票

您应绝对避免使用IsNothing()

这里是4个原因来自文章IsNothing() VS Is Nothing

  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%(超过1000000000次迭代!

    ]
  4. 也许是个人喜好,但IsNothing()的读取方式类似于Yoda Condition。当您查看变量时,您正在检查其状态,并将其作为调查的主题。

    it做x吗? --- NOT xit的属性吗?

    所以我认为If a IsNot NothingIf Not IsNothing(a)读得更好


29
投票

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

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

If printDialog IsNot Nothing Then
    'blah
End If

比这个...

If Not obj Is Nothing Then
    'blah
End If

5
投票

VB充满了这样的事情,试图使它既“像英语”又让习惯于经常使用()和{}的语言的人们感到满意。例如,在“ like english”方面,VB具有关键字“ Ain't”……不,我不是在开玩笑。另一方面,您可能已经知道大多数时间都可以将()与函数调用结合使用,但不必这样做。

我更喜欢IsNothing()...但是我使用C和C#,所以这很舒服。而且我认为它更具可读性。但是,请随您便去吧。


5
投票

我倾向于“什么都不是”,主要是因为它看起来更面向对象。

当然Visual Basic ain't获得了Ai n't关键字。


2
投票

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


1
投票

我最初使用IsNothing,但一直在较新的项目中使用Is Nothing,主要是为了提高可读性。我唯一坚持使用IsNothing的方法是,如果我要维护始终使用的代码,并且希望保持一致。


-2
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.