这里是否有人使用 VB.NET 并且强烈偏好或反对使用 IsNothing而不是 Is Nothing(例如,If IsNothing(anObject)或 If anObject Is Nothing...) ?如果是这样,为什么?
IsNothing
Is Nothing
If IsNothing(anObject)
If anObject Is Nothing...
编辑: 如果你认为它们都是可以接受的,你认为最好选择一个并坚持下去,还是把它们混合在一起?
VB 充满了这样的东西,试图使它“像英语”和舒适的人习惯于使用()和{}很多语言。 另一方面,正如您可能已经知道的那样,大多数情况下,如果您愿意,可以使用()函数调用,但不一定非要这样做。
我更喜欢 IsNothing () ... ... 但是我使用 C 和 C # ,所以这样更舒服。我觉得这样更易读。但你觉得怎么舒服就怎么做。
我倾向于“什么都不是”的替代方案,主要是因为它看起来更像 OO。
当然 Visual Basic 不是得到了 Ai’t 关键字。
如果您在 MSIL 执行时查看它,您将看到它没有编译成完全相同的代码。当您使用 IsNothing ()时,它实际上会调用该方法,而不仅仅是计算表达式。
我倾向于使用“ Is Nothing”的原因是当我否定时,它会变成“ IsNot Nothing”而不是“ Not IsNothing (object)”,我个人觉得这样看起来更可读。
我同意“什么都不是”。如上所述,否定“什么都不是”是很容易的。
我觉得这个更容易理解。
If printDialog IsNot Nothing Then 'blah End If
比这个..。
If Not obj Is Nothing Then 'blah End If
我最初使用 IsNothing,但我已经开始在新的项目中使用 IsNothing,主要是为了提高可读性。我唯一坚持使用 IsNothing 的时候,是在我维护代码的时候,我想保持代码的一致性。
我发现 Patrick Steele在他的博客上回答这个问题最好: 逃避是没有意义的()
我在这里没有抄袭他的任何回答,以确保 Patrick Steele 因他的职位而受到表扬。但我确实认为,如果你正在试图决定是否使用“什么都没有”或“什么都没有”,你应该读读他的帖子。我想你会同意“一无所有”是最好的选择。
Edit-VoteCoffe 的评论
部分文章内容: 在阅读了更多的代码后,我发现了另一个您应该避免这种情况的原因: 它接受值类型!显然,因为 IsNothing ()是一个接受“对象”的函数,所以您可以向它传递任何您想传递的内容。如果是值类型,。NET 会将其打包成一个对象并传递给 IsNothing ——对于打包的值,IsNothing 总是返回 false!NET 编译器将检查“ Is Nothing”样式语法,如果您试图对值类型执行“ Is Nothing”,则不会编译。但是 IsNothing ()函数在编译时没有抱怨。- PSteele-投票咖啡
IsNothing()
下面是文章 IsNothing () VS Is Nothing 中的 四个理由
最重要的是,IsNothing(object)将所有内容都作为对象传递给它,甚至包括值类型!因为值类型不能是 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 库有不必要的依赖关系。
Microsoft.VisualBasic.dll
它很慢——实际上慢了33.76% (超过100000000次迭代) !
也许是个人偏好,但 IsNothing()读起来像 尤达条件。当你观察一个变量的时候,你是在检查它的状态,把它作为你研究的对象。
也就是说,它做 x 吗? ——-没有是 它的一个属性吗?
所以我认为 If a IsNot Nothing读数比 If Not IsNothing(a)好
If a IsNot Nothing
If Not IsNothing(a)
Is Nothing 需要已分配给值 Nothing 的对象。IsNothing ()可以接受任何未初始化的变量,包括数值类型的变量。这对于测试是否传递了可选参数非常有用。