[这里有人使用VB.NET并强烈赞成或反对使用IsNothing
而不是Is Nothing
(例如If IsNothing(anObject)
或If anObject Is Nothing...
)吗?如果是这样,为什么?
编辑:如果您认为它们都同样可以接受,您是否认为最好选择一个并坚持使用,还是可以将它们混合在一起?
如果您在执行MSIL时查看它,将会发现它没有编译为完全相同的代码。当您使用IsNothing()时,它实际上是对该方法进行调用,而不是仅仅对表达式求值。
我倾向于使用“不存在”的原因是,当我否定它时,它变成了“ IsNot Nothing”而不是“ Not IsNothing(object)”,我个人觉得它更具可读性。
[我发现Patrick Steele在他的博客上最好地回答了这个问题:Avoiding IsNothing()
我没有在这里复制他的任何答案,以确保帕特里克·斯蒂尔(Patrick Steele)对该职位的赞誉。但是我确实认为,如果您要尝试决定使用“无”还是“无”,则应该阅读他的文章。我认为您会同意“无为是”的最佳选择。
编辑-VoteCoffe在这里的评论
部分文章的内容:查看更多代码后,我发现另一个应避免的原因:它接受值类型!显然,由于IsNothing()是一个接受“对象”的函数,因此您可以将任何想要的东西传递给它。如果是值类型,.NET会将其装箱成一个对象,然后将其传递给IsNothing,该值始终对装箱的值返回false! VB.NET编译器将检查“ Is Nothing”样式的语法,如果尝试对值类型执行“ Is Nothing”,则不会编译。但是IsNothing()函数的编译没有任何抱怨。 -PSteele – VoteCoffee
IsNothing()
这里是4个原因来自文章IsNothing() VS Is Nothing
最重要的是,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。当您查看变量时,您正在检查其状态,并将其作为调查的主题。
即it做x吗? --- NOT x
是it的属性吗?
所以我认为If a IsNot Nothing
比If Not IsNothing(a)
读得更好
我同意“没什么”。如上所述,很容易否定“不算什么”。
我觉得这更容易阅读...
If printDialog IsNot Nothing Then
'blah
End If
比这个...
If Not obj Is Nothing Then
'blah
End If
VB充满了这样的事情,试图使它既“像英语”又让习惯于经常使用()和{}的语言的人们感到满意。例如,在“ like english”方面,VB具有关键字“ Ain't”……不,我不是在开玩笑。另一方面,您可能已经知道大多数时间都可以将()与函数调用结合使用,但不必这样做。
我更喜欢IsNothing()...但是我使用C和C#,所以这很舒服。而且我认为它更具可读性。但是,请随您便去吧。
我倾向于“什么都不是”,主要是因为它看起来更面向对象。
当然Visual Basic ain't获得了Ai n't关键字。
我也倾向于部分使用Is Nothing版本,就像我在SQL中一样使用它。
我最初使用IsNothing,但一直在较新的项目中使用Is Nothing,主要是为了提高可读性。我唯一坚持使用IsNothing的方法是,如果我要维护始终使用的代码,并且希望保持一致。
是没有要求将一个对象分配给值Nothing。 IsNothing()可以接受任何尚未初始化的变量,包括数字类型。例如,这在测试是否已传递可选参数时很有用。