这里有没有人使用VB.NET,并强烈偏好或反对使用IsNothing
而不是Is Nothing
(例如,If IsNothing(anObject)
或If anObject Is Nothing...
)?如果是这样,为什么?
编辑:如果你认为它们都是同样可以接受的,你认为最好选择一个并坚持使用它,或者混合它们是否可以?
答案 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个原因最重要的是,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%(超过10亿次迭代)!
也许是个人偏好,但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)
我更喜欢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()可以接受任何尚未初始化的变量,包括数字类型。例如,在测试是否已传递可选参数时,这很有用。