这里有没有人使用VB.NET,并且强烈支持或反对使用IsNothing而不是Is Nothing (例如If IsNothing(anObject)或If anObject Is Nothing...)?如果有,原因何在?
编辑:如果你认为它们都是同样可以接受的,你认为最好的选择是选择一个并坚持下去,还是可以混合它们?
发布于 2008-08-08 12:28:37
如果您在执行MSIL时查看它,您会发现它并没有编译成完全相同的代码。当您使用IsNothing()时,它实际上会调用该方法,而不仅仅是计算表达式。
我倾向于使用"Is Nothing“的原因是,当我否定它时,它变成了"Not Nothing”而不是"IsNot IsNothing(object)“,我个人觉得后者看起来更具可读性。
发布于 2008-08-11 14:12:57
我发现Patrick Steele在他的博客上回答这个问题最好:Avoiding IsNothing()
我没有在这里复制他的任何答案,以确保Patrick Steele在他的帖子中获得信任。但我确实认为,如果你想决定是使用Is Nothing还是IsNothing,你应该阅读他的帖子。我想你会同意什么都不是是最好的选择。
编辑-VoteCoffe的评论在这里
部分文章内容:在查看了更多代码后,我发现了另一个应该避免的原因:它接受值类型!显然,因为IsNothing()是一个接受'object‘的函数,所以你可以向它传递任何你想要的东西。如果它是一个值类型,.NET将把它打包成一个对象,并将它传递给IsNothing --它总是在装箱的值上返回false!VB.NET编译器将检查"Is Nothing“样式的语法,如果您试图对值类型执行"Is Nothing”操作,则不会进行编译。但是IsNothing()函数在编译时没有任何问题。-PSteele - VoteCoffee
发布于 2014-07-01 00:07:11
您绝对应该避免使用IsNothing()
以下是来自文章的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库有不必要的依赖。
IsNothing()读起来像个Yoda Condition。当你查看一个变量时,你是在检查它的状态,并把它作为你调查的对象。例如,它做x吗?- Is x it a property?
所以我认为If a IsNot Nothing比If Not IsNothing(a)读起来更好
https://stackoverflow.com/questions/5791
复制相似问题