[英]IsNothing versus Is Nothing
这里有没有人使用 VB.NET 并且强烈偏好或反对使用IsNothing
而不是Is Nothing
(例如, If IsNothing(anObject)
或If anObject Is Nothing...
)? 如果是这样,为什么?
编辑:如果您认为它们都同样可以接受,您认为最好选择一个并坚持使用,还是可以混合使用?
如果您查看正在执行的 MSIL,您会发现它不会编译为完全相同的代码。 当您使用 IsNothing() 时,它实际上会调用该方法,而不仅仅是评估表达式。
我倾向于使用“Is Nothing”的原因是,当我否定它时,它会变成“IsNot Nothing”而不是“Not IsNothing(object)”,我个人认为这看起来更具可读性。
我发现Patrick Steele在他的博客上回答了这个问题最好的: Avoiding IsNothing()
我没有在这里复制他的任何回答,以确保帕特里克斯蒂尔的帖子得到认可。 但我确实认为,如果你想决定是使用 Is Nothing 还是 IsNothing,你应该阅读他的帖子。 我想你会同意 Is Nothing 是最好的选择。
编辑 - VoteCoffe 的评论在这里
部分文章内容:在查看更多代码后,我发现了另一个应该避免这种情况的原因:它接受值类型! 显然,由于 IsNothing() 是一个接受“对象”的函数,因此您可以将任何您想要的传递给它。 如果它是一个值类型,.NET 会将它装箱成一个对象并将它传递给 IsNothing——它总是在装箱的值上返回 false! VB.NET 编译器将检查“Is Nothing”样式语法,如果您尝试对值类型执行“Is Nothing”,则不会编译。 但是 IsNothing() 函数编译时没有抱怨。 -PSteele – VoteCoffee
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
不会编译,而是编译器会引发错误:
“是”运算符不接受“整数”类型的操作数。
操作数必须是引用或可为空的类型。
IsNothing(object)
实际上是Microsoft.VisualBasic.dll
的一部分。
这是不可取的,因为您对 VisualBasic 库有不必要的依赖。
它很慢——实际上慢了 33.76%(超过 1000000000 次迭代)!
也许是个人喜好,但IsNothing()
读起来像Yoda Condition 。 当您查看一个变量时,您正在检查它的状态,并将其作为您调查的主题。
即它做 x 吗? ---不是x
ing 是它的一个属性吗?
所以我认为If a IsNot Nothing
比If Not IsNothing(a)
读起来更好
我同意“什么都不是”。 如上所述,很容易用“IsNot Nothing”来否定。
我觉得这更容易阅读......
If printDialog IsNot Nothing Then
'blah
End If
比这个...
If Not obj Is Nothing Then
'blah
End If
VB 充满了类似的东西,试图使它既“像英语一样”,又让习惯使用 () 和 {} 的语言的人感到舒服。 另一方面,正如您可能已经知道的那样,大多数情况下,如果您愿意,您可以将 () 与函数调用一起使用,但不是必须的。
我更喜欢 IsNothing()...但我使用 C 和 C#,所以这很舒服。 而且我认为它更具可读性。 但是选择你觉得更舒服的任何东西。
我倾向于“什么都不是”的选择,主要是因为它看起来更面向对象。
当然,Visual Basic 没有Ain't 关键字。
我也倾向于使用Is Nothing版本部分地使用它,就像我在SQL中一样。
我最初使用 IsNothing,但我一直在转向在较新的项目中使用 Is Nothing,主要是为了可读性。 我唯一坚持使用 IsNothing 的情况是,如果我要维护在整个过程中使用的代码并且我想保持一致。
Is Nothing 需要一个已分配给 Nothing 值的对象。 IsNothing() 可以采用任何尚未初始化的变量,包括数字类型。 例如,在测试是否传递了可选参数时,这很有用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.