IsNothing与Is Nothing的区别

136

有人在这里使用VB.NET并且对使用IsNothingIs Nothing有强烈偏好的吗?例如:If IsNothing(anObject)If anObject Is Nothing...)?如果是这样,为什么?

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


3
避免使用 IsNothing() 有很多好理由。 - KyleMit
@JesseChisholm,单个评论内容太多了,但是我之前的评论中发布了这篇文章的链接,其中列举了5种不同的方法。http://blog.reneorban.com/2011/12/vbnet-isnothing-vs-is-nothing.html - KyleMit
技术答案非常有趣,但遗憾的是问题留得太开放了,导致一些毫无用处、越来越模糊的个人偏好回答。 - underscore_d
8个回答

128
如果您查看正在执行的 MSIL,您会发现它不会编译为完全相同的代码。当您使用 IsNothing() 时,实际上会调用该方法,而不仅仅是评估表达式。
我倾向于使用 "Is Nothing" 的原因是在否定时变成了 "IsNot Nothing" 而不是 "Not IsNothing(object)",个人觉得这看起来更易读。

47

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

我没有在这里复制他的答案,以确保Patrick Steele得到他的文章的荣誉。但是我认为,如果你试图决定是否使用Is Nothing或IsNothing,你应该阅读他的文章。我认为你会同意Is Nothing是最好的选择。

编辑 - VoteCoffe的评论在此处

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


7
在审查更多代码后,我发现另一个应该避免使用它的原因:它接受值类型!显然,由于IsNothing()是一个接受'object'的函数,你可以传递任何你想要的东西。如果它是一个值类型,.NET将把它装箱成为一个对象,并将其传递给IsNothing - 这将在装箱值上始终返回false!VB.NET编译器会检查“Is Nothing”样式语法,如果你尝试在值类型上执行“Is Nothing”,它不会编译。但是,IsNothing()函数会在没有任何警告的情况下编译通过。 -PSteele - VoteCoffee
7
发布一些内容,因为你永远不知道链接是否会失效,我认为这对谈话有所帮助。 - VoteCoffee

38

请务必避免使用IsNothing()

以下是来自文章IsNothing() VS Is Nothing4个理由

  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' 类型的操作数。
    操作数必须是引用类型或可空类型。

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

    它很慢 - 实际上比其他方法慢了 33.76%(在 1000000000 次迭代中)!

    这可能是个人喜好,但是 IsNothing() 看起来像 Yoda Condition。当你查看变量时,你正在检查它的状态,将其作为调查的主题。

    例如:它是否执行 x?--- 不是“x”是它的属性吗?

    所以我认为 If a IsNot Nothing 读起来比 If Not IsNothing(a) 更好。


29

我同意 "Is Nothing"。如上所述,使用 "IsNot Nothing" 可以轻松否定它。

我发现这样更易于阅读...

If printDialog IsNot Nothing Then
    'blah
End If

比这更...

If Not obj Is Nothing Then
    'blah
End If

4

VB充满了这样的东西,试图使其既“像英语”,又适合那些习惯于使用()和{}的语言的人感到舒适。

而另一方面,正如您可能已经知道的那样,大多数情况下,如果您愿意,可以在函数调用中使用(),但不必这样做。

我更喜欢使用IsNothing()... 但我使用C和C#,所以这只是让我感觉舒适的东西。 我认为这样更易读。 但是请随心所欲选择您感觉更舒适的方式。


4

我倾向于使用“Is Nothing”这个选择,主要是因为它看起来更面向对象。

毫无疑问,Visual Basic 没有Ain't关键字。


VB.NET 可以使用扩展方法吗? :) - klkitchens

1

我最初使用了IsNothing,但在新项目中,我已经开始使用Is Nothing,主要是为了可读性。唯一坚持使用IsNothing的情况是,如果我正在维护使用该方法的代码,并且我想保持一致性。


-2

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


这是错误的。你确定没有搞错吗?"IsNothing 旨在处理引用类型。值类型不能保存 Nothing 的值,如果你将 Nothing 赋给它,它会恢复为默认值[...] IsNothing 总是返回 False。" 但是Nothing "代表任何数据类型的默认值[...] 对于值类型,[这取决于]该值类型是否可为空。" 那么 Is Nothing 不是更好吗? - underscore_d

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接